Вопрос

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

NSNumber *nn0 = [NSNumber numberWithInt:0];

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

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

[nn0 release];

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

Мой вопрос:если я использую NumberWithInt для инициализации NSNumber, нужно ли мне выполнять какое-либо управление памятью?

Это было полезно?

Решение

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

На этой странице вы найдете описание удобных конструкторов и способы управления памятью для них.

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

Другие советы

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top