Вопрос о сохранении счетчиков и инициализации переменных-членов - PullRequest
1 голос
/ 11 февраля 2011

Представьте, что у меня есть переменная-член

@property(nonatomic,retain)NSArray *array;

Теперь в моем viewDidLoad я установил простой массив

array = [[NSArray alloc]initWithObjects:@"A",@"B","C",nil];

Мой счет сохранения для массива будет равен 1, верно?

Теперь, если бы я должен был установить массив с помощью метода доступа

self.array = [[NSArray alloc]initWithObjects:@"A",@"B","C",nil];

Является ли мой счетчик хранения 2, потому что мой метод доступа увеличивает счетчик хранения на 1?

Какое соглашение для инициализации переменных-членов?

1 Ответ

3 голосов
/ 11 февраля 2011

Это правильно, счет удержания для self.array = заканчивается как 2.

Сначала вы alloc init новый NSArray объект. Это счетчик сохранения 1. Во-вторых, ваш установщик отправляет объекту сообщение retain при назначении его вашему экземпляру var. Это увеличивает счет удержания до 2.

Какое соглашение для инициализации переменных-членов?

Помимо непосредственной установки ivar array =, как в вашем вопросе, вот несколько способов сделать это с помощью свойства self.array без утечки:

  1. Autorelease:

    self.array = [[[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil] autorelease];
    
  2. Используйте метод класса arrayWithObjects:. Проще, а также выдает автоматически выпущенный объект:

    self.array = [NSArray arrayWithObjects:@"A", @"B", @"C", nil];
    
  3. Создайте временную переменную для хранения нового указателя, затем отпустите ее после установки свойства (к которому он будет сохранен к тому времени):

    NSArray *tmpArray = [[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil];
    self.array = tmpArray;
    [tmpArray release];
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...