我是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 :(得分:4)
创建这样的对象时:
NSMenuItem *myLocalItem = [[NSMenuItem alloc] init];
对象不在本地堆栈中,但在堆上,唯一不受范围影响的是指针,而不是对象。
因此,是的,你必须释放它。
答案 1 :(得分:1)
不会自动释放任何内容(除非您使用垃圾回收)。你绝对应该在这里发布myLocalItem
(MySampleMenu
应该保留它。)
答案 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。这些规则是决定对象何时解除分配的唯一因素。