Нужно ли явно указывать мой NSNumber? - PullRequest
9 голосов
/ 29 апреля 2009

Я определяю число следующим образом:

NSNumber *nn0 = [NSNumber numberWithInt:0];

Отлично работает без каких-либо выделений. Насколько я понимаю, если я использую numberWithInt, alloc и init вызываются автоматически.

Если я попытаюсь отключиться в конце своей функции, у меня возникнут проблемы:

[nn0 release];

Я получаю ошибку во время выполнения.

У меня такой вопрос: если я использую numberWithInt для инициализации NSNumber, нужно ли мне на нем управлять памятью?

Ответы [ 3 ]

15 голосов
/ 29 апреля 2009

«Удобные конструкторы» для многих типов создают объект, который автоматически «автоматически высвобождается», т.е. новый объект будет сохранен текущим NSAutoreleasePool. Вам не нужно вручную освобождать эти объекты - они будут освобождены, когда текущий NSAutoreleasePool будет освобожден / истощен.

См. Эту страницу для описания удобных конструкторов и как управлять памятью для них.

http://www.macdevcenter.com/pub/a/mac/2001/07/27/cocoa.html?page=3

7 голосов
/ 29 апреля 2009

Просто следуйте основному правилу управления памятью: если вы «владеете» переменной, вы должны в конечном итоге отказаться от владения. Вы вступаете во владение путем: создания объекта (alloc / new / copy) или, в частности, вступления во владение (retain). Во всех этих случаях вам необходимо освободить его.

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

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

4 голосов
/ 29 апреля 2009

Правило простое, с очень немногими исключениями:

Если в селекторе, возвращающем объект, есть слово «new», «alloc», «retain» или «copy», то вы являетесь владельцем возвращенного объекта и несете ответственность за его освобождение после завершения.

В противном случае вы не владеете им и не должны его выпускать. Если вы хотите сохранить ссылку на не принадлежащий объекту, вы должны вызвать -[NSObject retain] в этом экземпляре. Теперь вы «владеете» этим экземпляром, поэтому вы должны вызывать -[NSObject release] в экземпляре, когда закончите с ним. Таким образом, вы не являетесь владельцем экземпляра, возвращенного -[NSNumber numberWithInt:], и не должны вызывать -release, когда закончите. Если вы хотите сохранить возвращаемый экземпляр за пределами текущей области (на самом деле за пределами срока действия текущего NSAutoreleasePool экземпляра), вам следует -retain it.

С точки зрения RegEx, Питер Хоси очень хорошо излагает это в своем блоге . Вы являетесь владельцем возвращенного экземпляра объекта, если селектор метода соответствует этому регулярному выражению:

/^retain$|^(alloc|new)|[cC]opy/

Конечно, окончательным справочником является Руководство по программированию управления памятью для какао .

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