我发现Objective-C / cocoa框架的一个例子有以下代码。
int main()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Create an array
NSArray *month = [NSArray arrayWithObjects:@ ... nill];
[pool drain];
}
Q1:这背后的魔力是什么(为什么我需要拥有NSAutoreleasePool代码?)? NSAutoreleasePool
和pool drain
区块之间发生了什么魔力?我发现我不需要自己发布*month
。这是因为它在NSAutoreleasePool
和pool drain
区块内吗?
Q2:使用Xcode,我已经获得了main()函数。在这种情况下,我如何使用NSAutoreleasePool
和pool drain
?
例如:
int main(int argc, char *argv[])
{
//NSAutoreleasePool *pool = [[[NSAutoreleasePool] alloc] init];
return NSApplicationMain(argc, (const char **) argv);
}
答案 0 :(得分:4)
Q1:神奇的是NSObject -autorelease实例方法调用NSAutoreleasePool + addObject:class方法。 NSObject实例汇集在当前的NSAutoreleasePool实例中。 NSAutoreleasePool -drain实例方法调用池化实例的释放方法。
Apple和GNUstep的Cocoa实现之间并不完全相同,但它是相似的。
我不确定为什么月份没有发布,应该通过排水来释放。
Q2:您可以在任何地方使用NSAutoreleasePool。实例化NSAutoreleasePool意味着新实例将更改当前池。 drain会将当前池返回到前一个实例。
除了NSApplicationMain永远不会返回。它调用exit函数退出应用程序并终止进程。
答案 1 :(得分:3)
Q1:
您不需要在给出的示例中释放month
实例,因为您正在调用的NSArray
类方法(arrayWithObjects:
)返回一个自动释放的实例。按照惯例,在Cocoa中,以类名开头的类方法将返回该类的自动释放实例。这些例子:
[NSString stringWithFormat:@"Holla %@", @"back girl!", nil];
[NSArray arrayWithObjects:@"Holla", @"back", @"girl!", nil];
两者都会返回自动释放的各自对象的实例。
答案 2 :(得分:0)
我对Objective C很新,但是让我给出一个解决方案:
自动释放池是Objective C以一种比手动更简单的方式处理垃圾收集的一种方式。
它通过计算引用来实现,或者在每次调用“retain”或“release”时都这样做。
因此,如果你在“a”中有一个对象的实例,你可以这样做:
这将它放入AutoreleasePool:
[a autorelease];
这告诉自动释放池你要暂时保留它:
[a retain];
当你现在调用[pool drain]
时,它会注意到你有一个对a的引用,它不会释放内存。但是,如果您稍后调用[a release]
,则在下次调用[pool drain]
时,它会看到没有对剩余内容的进一步引用,并释放内存。
我有一种潜在的怀疑,我只是在圈子里谈论自己并没有太多意义,但这里有关于引用计数的维基百科文章:http://en.wikipedia.org/wiki/Reference_counting