Большинство программистов предпочитают помещать alloc, init одновременно в одном выражении.
Это потому, что экземпляр, возвращаемый инициализатором, не обязательно является возвращаемым +alloc
.Например, это неправильно и приведет к сбою вашей программы:
NSString *str = [NSString alloc];
[str initWithString:@"sagar"];
, потому что в этом случае -initWithString:
вызывает освобождение предыдущего экземпляра, а str
в конечном итоге указывает на освобожденный объект.Это можно исправить с помощью:
NSString *str = [NSString alloc];
str = [str initWithString:@"sagar"];
, так что str
указывает на другой экземпляр, возвращаемый -initWithString:
.Форма:
NSString *str = [[NSString alloc] initWithString:@"sagar"];
гарантирует, что str
указывает на правильный экземпляр.
Тем не менее, -autorelease
отличается.Если он не был отвергнут злым джинном, он всегда возвращает самого получателя.Это означает, что оба:
NSString *str = [[NSString alloc] initWithString:@"sagar"];
str = [str autorelease];
и:
NSString *str = [[NSString alloc] initWithString:@"sagar"];
[str autorelease];
являются правильными и работают одинаково.
Что касается различия между:
NSString *str = [[[NSString alloc] initWithString:@"sagar"] autorelease];
и:
NSString *str = [[NSString alloc] initWithString:@"sagar"];
…
[str autorelease];
некоторые люди предпочитают использовать -autorelease
в тандеме с распределением, чтобы избежать забывания об автоматическом высвобождении экземпляра позже.Другие предпочитают помещать его в оператор return
(если есть):
NSString *str = [[NSString alloc] initWithString:@"sagar"];
…
return [str autorelease];
, чтобы сделать (более) явным, чтобы метод / функция возвращал объект с автоматическим освобождением.