2009-12-16 3 views
1

Я новичок в программировании Objective-C и Cocoa, поэтому в моих первых примерах проектов я всегда принимал заявление о выпуске/автореализовании всех моих выделенных и скопированных объектов.Локальный объем области и управление памятью в какао

А как насчет локальных объектов, выделенных внутри методов? Позвольте мне написать пример кода, вот мой объект интерфейса:

@interface MySampleObject : NSObject { 
    NSMenu *mySampleMenu; 
} 

- (void)setupMenu; 

@end 

Давайте теперь предположим, что в реализации setupMenu я создать пункт локального меню для добавления в меню, как следует:

- (void)setupMenu 
{ 
    NSMenuItem *myLocalItem = [[NSMenuItem alloc] init]; 
    [myLocalItem setTitle:@"The Title"]; 
    [mySampleMenu addItem:myLocalItem]; 
    [myLocalItem release]; 
} 

Вопрос: должен ли myLocalItem быть выпущен после его добавления в меню или я могу предположить, что область действия объекта является локальной, поэтому нет необходимости вручную выпускать ее, поскольку она будет автоматически выпущена?

+0

Хорошо, это ясно! Но, глядя на код MBPreferencesController (http://www.mattballdesign.com/blog/2008/10/01/building-a-preferences-window/) в методе -_setupToolbar, объект панели инструментов не выпущен.Это ошибка? – massimoksi

+0

Предполагая, что он не использует сбор мусора, это была ошибка, да. –

ответ

4

При создании такого объекта, как это:

NSMenuItem *myLocalItem = [[NSMenuItem alloc] init]; 

Объект находится не в локальном стеке, но в куче, единственное, что отваливается сферу является указателем, а не объект.

Поэтому да, вы должны его отпустить.

+0

Правильно. У вас никогда не было объекта в стеке памяти Objective-C. Вы всегда получаете указатель на объект кучи. Этот указатель может находиться в стеке. Но вам все равно нужно освободить объект. – nash

1

Ничего не будет выпущено автоматически (если вы не используете сбор мусора). Вы должны обязательно отпустить myLocalItem здесь (и MySampleMenu должен сохранить его).

0

Вы должны выполнить инструкцию [myLocalItem release];

NSMenuItem * myLocalItem = [[NSMenuItem alloc] init]; на этом этапе myLocalItem будет иметь значение удержания как 1.

[mySampleMenu addItem: myLocalItem]; на этом этапе myLocalItem будет иметь счет удержания как 2, так как mySampleMenu ссылается на этот объект (он берет судно владельца, добавляя счетчик удержания объекта)

[myLocalItem release]; Поскольку код выходит из функции, владелец судна на объекте должен быть удален. в основном вы уменьшаете количество удержаний на 1.

myLocalItem - память, выделенная этому объекту, будет выпущена, когда mySampleMenu отпустит подменю.

Примечание: объект не объявлен в стеке, все создание объекта происходит в куче. Существует только другой способ обработки памяти, например, 1. Ручной контроль количества ссылок 2. Добавить объект в пул автоопределения, а затем пул решить, когда отправить сообщение о выпуске. 3. Включить сборку мусора.

0

Сфера не имеет к этому никакого отношения. Независимо от того, должен ли объект умирать (или умереть сразу) или нет, полностью определяется сообщениями, отправленными ему.

Отзыв the memory management rules for Cocoa. Эти правила - это единственные вещи, которые определяют, когда объект будет dealloc.