В Objective-C, (или C в целом),
MyObject* myObject;
внутри реализации метода не инициализирует myObject
с nil
. Точно так же
int a;
не инициализирует a
с 0. Это то, что люди, которые сделали C, давно решили. Был исторический разум, почему это так.
Просто явно инициализируйте его как
MyObject* myObject=nil;
Обратите внимание, что ivar, определенный в интерфейсе класса, автоматически устанавливается на zero
до вызова init
.
Обновление: также обратите внимание, что myObject
является указателем на реальный объект, который содержит данные. Итак, если вы просто сделаете
MyObject* myObject;
это означает, что myObject
указывает на кусок мусорной памяти, который вообще не будет работать правильно.
MyObject* myObject=nil;
заставляет myObject
указывать на ничего . Теперь это по крайней мере последовательно ничего не делает. Что это за линия
MyObject* myObject=[[MyObject alloc] init];
делает, чтобы выделить MyObject
объект в памяти, инициализировать его, а затем заставить myObject
указать на фрагмент памяти, правильно выделенный и инициализированный. Теперь, если MyObject
имеет интерфейс
@interface MyObject:NSObject {
NSString* string;
}
@end
и если вы определите метод init,
@implementation MyObject
-(id)init {
if(self=[super init]) {
... do something ...
}
return self;
}
после успешного выполнения [super init]
Objective-C гарантирует, что для параметра ivar string
установлено значение nil
, т. Е. string
указывает на ничто. Но это не значит, что NSString
выделен или инициализирован.