Cocoa中的本地对象范围和内存管理

时间:2009-12-16 10:09:39

标签: objective-c cocoa memory-management

我是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在被添加到菜单后是否应该被释放,或者我可以假设对象的范围是本地的,因此不需要手动释放,因为它会自动释放?

4 个答案:

答案 0 :(得分:4)

创建这样的对象时:

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

对象不在本地堆栈中,但在堆上,唯一不受范围影响的是指针,而不是对象。

因此,是的,你必须释放它。

答案 1 :(得分:1)

不会自动释放任何内容(除非您使用垃圾回收)。你绝对应该在这里发布myLocalItemMySampleMenu应该保留它。)

答案 2 :(得分:0)

您应该执行语句[myLocalItem release];

NSMenuItem * myLocalItem = [[NSMenuItem alloc] init]; 在此阶段,myLocalItem将保留计数为1。

[mySampleMenu addItem:myLocalItem]; 在此阶段,myLocalItem将保留计数设为2,因为mySampleMenu引用此对象(它通过向对象添加保留计数来获取所有者)

[myLocalItem release]; 由于代码不在函数中,因此应删除对象上的所有者。基本上你将保留计数减少1。

myLocalItem - 当mySampleMenu释放子菜单时,将释放分配给此对象的内存。

注意:没有像在堆栈中声明的对象,所有对象创建都发生在堆中。 只有不同的处理内存的方法,比如 1.手动处理引用计数 2.将对象添加到自动释放池,然后池决定何时发送释放消息。 3.启用垃圾收集。

答案 3 :(得分:0)

范围与它无关。对象是否由于死亡(或将立即死亡)完全取决于发送给它的消息。

回顾the memory management rules for Cocoa。这些规则是决定对象何时解除分配的唯一因素。