Это был ваш ответ, и вы спросили , почему ваш ответ был неверным? Я спрашиваю, потому что ваше предположение в основном верно (на более высоком уровне).
Он не совсем «сохраняется» при возврате из alloc+init
, это объект, к которому вы имеете одну ссылку, и должен балансировать с release
или autorelease
. Для вспомогательного конструктора (+[NSString string]
) вам возвращается объект, на который у вас нет нулевых ссылок, но который вы можете ожидать до тех пор, пока текущий пул автоматического выпуска не будет извлечен, если вы не отправите ему явное сохранение (при условии, что MRC или ARC так как он помечен iOS).
На более низком уровне вы могли бы сделать некоторые предположения, но я не ожидал бы, что этот вопрос будет во многих интервью по предмету (если вы не сказали им, что вы среднего или старшего уровня). По сути, это определяется реализацией, но обе формы могут возвращать одну и ту же статическую константу NSString
(это могло быть тем, что искал интервьюер). Для иллюстрации:
@implementation NSString
static NSString * const EmptyNSString = @"";
- (id)init
{
self = [super init];
[self release];
return EmptyNSString;
}
+ (id)string
{
return EmptyNSString;
}
...
Опять же, это определенная реализация, но очевидная оптимизация. Кроме того, эта оптимизация делает физически подклассы конкретных неизменяемых типов (NSString) трудными для изменяемых вариантов (NSMutableString) , в некоторых случаях .