2011-12-20 4 views
0
UIButton *btn = [[UIButton alloc]init]; 

В приведенном выше коде, я должен освободить БТН, потому что я знаю, у меня есть Alloc их, а затем мне нужно выполнить [btn release]; некоторые где.Высвобождение памяти в ИОС

UIButton *btn = [UIButton buttonwithtype:UIButtonTypeRoundrect]; 

Во втором типе я должен освободить BTN или БТН на autoreleased объект, который я не должен называть освободить себя?

Как выпустить btn второго типа?

ответ

2

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

Вместо этого просто подумайте о том, есть ли у вас собственный объект или нет. Для методов, которые имеют alloc, new или copy во имя — или для объектов, которые вы явным образом, полученные в собственность вместе с retain — эти подразумевают, что вы собственный возвращаемый объект, и что вы должны отказаться от вашей собственности с release. Для объектов, которые у вас нет, вам не нужно указывать release.

Управление памятью очень простой. Соберите их на память, и ответы на такие вопросы станут второй натурой.

+0

Большое спасибо dreamlax – raghul

+1

Почему downvote? – dreamlax

0

Во втором типе он возвращает объект автореферата, поэтому вам не нужно беспокоиться о его освобождении.

1

Вам не нужно отпускать свою кнопку во втором примере; [UIButton buttonWithType:] возвращает автореализованный объект.

Существует простое правило: вам нужно release только тогда, когда вы alloc, retain, copy или mutableCopy.

+0

Apple упомянула, что не стоит думать о том, являются ли объекты автореализованными или нет, только если вы являетесь владельцем объекта. Как я уже упоминал в своем собственном ответе, многие удобные методы не возвращают объекты с автореализацией, но являются объектами, которые у вас нет. – dreamlax

+0

См. Верхнюю часть страницы 14 этого [PDF] (http://www.apple.com.cn/developer/iphone/library/documentation/UserExperience/Conceptual/MemoryMgmt/MemoryMgmt.pdf). – dreamlax

0

Первый случай:

Вы должны освободить его, потому что вы являетесь его владельцем.

  • При создании объекта (новый или Alloc, копировать или mutablecopy), он имеет сохранить кол 1, и вы являетесь его владельцем.
  • Когда вы отправляете сообщение о сохранении объекта, его количество удержания равно с шагом 1, и вы владеете им.

Второй случай:

Кнопка вы получаете получается из конструктора удобства.

«Конструктор удобства» создает объект, которому отправляется сообщение автореферата.

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

+0

Вы обсуждаете ряд деталей реализации, которые не обязательно верны или релевантны этому вопросу. Пул авторекламы может стекать быстрее, чем до конца текущего цикла событий, если новый пул авторесурсов создается вручную (для управления памятью в замкнутом цикле). Вам не важно, когда объект будет выпущен, вам следует подумать о том, являетесь ли вы объектом или нет. – dreamlax

0

Во второй раз вам не нужно отпускать кнопку, она автоматически возвращает тип авторекламы. И вам требуется только, чтобы объект был выпущен, когда вы владеете им (например, с помощью alloc или new или copy).

Смежные вопросы