Авто-релиз против выпуска - PullRequest
9 голосов
/ 06 мая 2010

Учитывая два сценария, какой код является лучшим и почему?

Autorelease

loginButton = [[[UIBarButtonItem alloc] initWithTitle:@"Login" 
                                                style:UIBarButtonItemStylePlain 
                                                target:self 
                                                action:@selector(loginButtonClicked:)]
                                                autorelease];
self.navigationItem.rightBarButtonItem = loginButton;

или

Release

loginButton = [[UIBarButtonItem alloc] initWithTitle:@"Login" 
                                                style:UIBarButtonItemStylePlain 
                                                target:self 
                                                action:@selector(loginButtonClicked:)];
self.navigationItem.rightBarButtonItem = loginButton;
[loginButton release];

Ответы [ 7 ]

14 голосов
/ 06 мая 2010

Для вашего примера это не имеет большого значения. Лично я бы, наверное, использовал первый случай. Это позволит вам позже добавлять модификации или отладку кода, не беспокоясь о перемещении строки [loginButton release].

8 голосов
/ 06 мая 2010

Кажется, что существует стигма против использования авто-релиза (то есть, я предпочитаю выпускать, когда это возможно), поэтому я обычно иду по второму пути. Но так как вы здесь не зациклены, освобождение сейчас и автоматическое освобождение позже будут иметь точно такой же эффект (поскольку другой объект сохранил loginButton, он не будет dealloc () ed).

Но я должен отметить, что большая часть утечек памяти вызвана забыванием добавить строку релиза, так что, вероятно, было бы лучше просто сразу воспользоваться автоматическим выпуском.

3 голосов
/ 06 мая 2010

Либо в вашем случае все будет хорошо, как говорит Карл. Это потому, что объект UIBarButtunItem остается в памяти, потому что одна ссылка на него хранится внутри self.navigationItem (при условии, что вы объявили это свойство с @property (retain).). Поэтому обычная диатриба против использования пула автоматического выпуска, заключающаяся в том, что он хранит ненужные объекты в памяти до конца текущего цикла событий, здесь не применима.

2 голосов
/ 06 мая 2010

Поскольку у вас очень ограниченный бюджет памяти на iPhone, предпочтительным способом должен быть явный выпуск.Таким образом, объекты не останавливаются до тех пор, пока пул авто-релиза не будет очищен во время цикла выполнения, и вы не сможете сократить объем памяти.

1 голос
/ 06 мая 2010

Так как навигационный элемент сохраняет его, эти два в конечном итоге идентичны. С точки зрения стиля, авто-релиз предпочтителен для возвратов из методов, которые не говорят о выделении или копировании в их имени, но в остальном это зависит от вас. Если объект не был сохранен отдельно, освобождение освободило бы память быстрее.

Проблема стиля кода установки ссылки на ноль после выпуска является связанным вопросом.

0 голосов
/ 06 ноября 2013

Хотя в представленном сценарии эти два случая идентичны, но есть небольшое преимущество в скорости использования релиза (ссылка) перед автоматическим выпуском. Так что, когда есть строгие требования к производительности, идите с выпуском

0 голосов
/ 06 мая 2010

Когда вы отправляете сообщение -autorelease объекту, вы добавляете его в список, и оно получит сообщение -release при освобождении пула автоматического выпуска. Вся цель -autorelease состоит в том, чтобы предоставить вам возможность сбалансировать ваши удержания и выпуски, когда что-то еще может хотеть объект, который вы выпускаете, но вы этого не делаете. В описываемой вами ситуации второй пример, который вы привели, лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...