Вы создали myArray
, используя метод arrayWithObjects:
. Этот метод возвращает объект, которым вы не владеете. Так как он вам не принадлежит, объект может быть освобожден (превращен в зомби) в следующий раз, когда программа пройдет цикл выполнения. На самом деле, это именно то, что происходит.
Если вы хотите, чтобы объект оставался рядом, вы должны стать его владельцем. Вы делаете это, сохраняя это. Есть три способа сохранить его. Вы можете явно отправить ему сообщение retain
:
myArray = [[NSMutableArray arrayWithObjects:@"apple",@"orange",@"bananas", nil] retain];
или вы можете использовать метод установки свойств:
[self setMyArray:[NSMutableArray arrayWithObjects:@"apple",@"orange",@"bananas", nil]];
Вы можете использовать точечный синтаксис, который использует метод установки свойств «под прикрытием»:
self.myArray = [NSMutableArray arrayWithObjects:@"apple",@"orange",@"bananas", nil];
Метод установки свойств (генерируемый компилятором) автоматически сохраняет объект.
Вы помещаете ссылку непосредственно в переменную вашего экземпляра, а не используете метод setter. Легко сделать эту ошибку. Компилятор может помочь вам поймать эту ошибку, если вы синтезируете свое свойство по-другому:
@synthesize myArray = _myArray;
Если вы сделаете это, свойство будет сохранено в переменной экземпляра с именем _myArray
вместо переменной экземпляра с именем myArray
. Поэтому вы должны явно использовать _
перед именем для прямого доступа к переменной экземпляра:
// COMPILE-TIME ERROR!
myArray = [NSMutableArray arrayWithObjects:@"apple",@"orange",@"bananas", nil];
// Compiles ok
_myArray = [[NSMutableArray arrayWithObjects:@"apple",@"orange",@"bananas", nil] retain];
// Also compiles ok
self.myArray = [NSMutableArray arrayWithObjects:@"apple",@"orange",@"bananas", nil];
Если вы используете префикс _
во всех переменных вашего экземпляра, то вы знаете, что всякий раз, когда вы устанавливаете что-то, начинающееся с _
, вам нужно беспокоиться о сохранении нового значения и освобождении старого значения.
третий способ сохранить объект, и лучше всего включить ARC (автоматический подсчет ссылок) для вашего проекта. Тогда вам не нужно беспокоиться о сохранении и освобождении объектов. Компилятор автоматически сохранит и освободит объект в нужное время, даже если вы используете переменную экземпляра напрямую.
Если вы решите не использовать ARC, тогда вам понадобится для изучения Компетенции Cocoa Core : «Управление памятью» , до Вы понимаете правила.