Подтвердить что ты не робот

Правильный синтаксис для метода 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;
}

...
4b9b3361

Ответ 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.