выделение объекта при назначении - PullRequest
0 голосов
/ 19 августа 2011

Я действительно новичок в objc и пытаюсь понять как можно больше и получить хороший распорядок, когда дело доходит до управления записью.

Мой вопрос: опасен ли такой код (я люблю короткий код)

NSMutableArray *items = [[NSMutableArray alloc] init]; 

[items addObject:[[UIBarButtonItem alloc] 
                   initWithTitle:@"Login"
                   style:UIBarButtonItemStyleBordered
                   target:self 
                   action:@selector(tryUserInput)]];

[self.toolbar setItems:items animated:TRUE];
[self.view addSubview:self.toolbar];

[items release];

В примерах я могу найти людей, которые всегда создают объект, который они добавляют в массив, добавляют его и затем освобождают. Если я выделю его и добавлю одновременно, массив позаботится об этом, да? И я выпускаю это, когда я закончу с этим. Кроме того, я могу написать это так?

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle: @ "Выход из системы" Стиль: UIBarButtonItemStyleDone Цель: ноль Действие: ноль];

Или я должен добавить к этому авто-релиз?

Если я понял это правильно, так как «навигационный элемент» является свойством, он сохраняет объект и заботится о нем. И массив сохраняет все объекты, которые я к нему добавляю. Так все должно быть хорошо?

Спасибо за вашу помощь

1 Ответ

3 голосов
/ 19 августа 2011

Вам нужно отправить autorelease на UIBarButton, иначе у вас будет утечка.

Когда вы alloc это, у него есть «счет удержания» +1; когда вы добавляете его в массив, он переходит на +2. Вам нужно вернуться к +1, чтобы единственным владельцем был массив, а UIBarButton будет освобожден при освобождении массива. Вы можете сделать это двумя способами:

[items addObject:[[[UIBarButtonItem alloc] 
               initWithTitle:@"Login"
               style:UIBarButtonItemStyleBordered
               target:self 
               action:@selector(tryUserInput)] autorelease]];

или

UIBarButtonItem *item = [[UIBarButtonItem alloc] 
               initWithTitle:@"Login"
               style:UIBarButtonItemStyleBordered
               target:self 
               action:@selector(tryUserInput)];
[items addObject:item];
[item release];
...