Правильный синтаксис для метода Objective-C init
Почему эта схема инициализации общего свойства не работает, когда синтезированный сеттер пытается освободить объект undefined myArray? Или объекты свойств автоматически инициализируются нулем, и мне не нужно делать это вообще?
@interface myClass : NSObject {
NSArray* myArray;
}
@property (nonatomic, retain) NSArray* myArray;
@end
@implementation myClass
@synthesize myArray;
-(id)init {
if ( self = [super init] ) {
self.myArray = nil;
}
return self;
}
...
Ответы
Ответ 1
Как уже указывали другие, переменная экземпляра уже инициализирована на nil
.
Кроме того, в соответствии с документацией Apple, переменные экземпляра должны быть установлены непосредственно в методе init
, поскольку методы getter/setter для класса (или его подкласса) ) может полагаться на полностью инициализированный экземпляр.
Ответ 2
Переменные экземпляра объекта в Objective-C по умолчанию инициализируются до nil
. Кроме того, разрешена передача сообщений nil
(в отличие от вызова метода на null
на языках функциональных вызовов, таких как Java, С# или С++). Результатом сообщения nil
является nil
, этот вызов [nil release];
- это просто nil
, а не исключение.
С другой стороны, лучше всего назначить/вызвать переменные экземпляра непосредственно в методах -init
и -dealloc
:
-(id)init {
if ( self = [super init] ) {
myArray = nil;
}
return self;
}
- (void)dealloc {
[myArray release];
[super dealloc];
}
Ответ 3
Он уже инициализирован до nil
.