Objective C NSAutoreleasePool 和发布

Posted

技术标签:

【中文标题】Objective C NSAutoreleasePool 和发布【英文标题】:Objective C NSAutoreleasePool and release 【发布时间】:2012-05-08 11:01:11 【问题描述】:

我是 Xcode 4 的新手。

最近我正在调试一个 Objective C 程序。我写了一个这样的函数:

-(void) func
    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
    Product *product=(Product *)[appDelegate.productData objectAtIndex:0];
    NSLog(product.Name);
    [product release];
    [pool release];

好笑的是,我已经添加了产品发布(因为我在早期调试时没有意识到池发布代码...)

当我运行程序时,它会因 EXC_BAD_ACCESS 而停止。 在我删除产品版本后,它可以正常运行。 我真的不知道产品对象最后是否发布。 而且我不确定这是创建 EXC_BAD_ACCESS 的要点。 所以我想问这个问题以确保一切。这会造成错误吗?

【问题讨论】:

【参考方案1】:

在Objective C - 内存处理概念非常简单 - 对象所有权。 如果我要分配一个对象,即将其保留计数增加 1,那么我有责任减少该计数。

现在您没有为产品对象分配任何新内存,您只是在引用现有内存。所以你不需要发布它。

您可以在自动释放池和发布中获得更多信息 - http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html%23//apple_ref/doc/uid/10000011-SW1 和 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html

【讨论】:

好吧,我在google上搜索了一些文档,发现“可以自动释放的对象释放会导致EXC_BAD_ACCESS”。并且基本上代码中的产品只是一个不需要发布的指针。但我发现很难在代码中识别哪个对象将被自动释放。在这种情况下,我会考虑如何防止这种情况。我可以在所有函数中使用 NSAutorelease 池,从不手动调用 release 并在所有返回的对象中使用 autorelease 来防止这种情况吗?

以上是关于Objective C NSAutoreleasePool 和发布的主要内容,如果未能解决你的问题,请参考以下文章

如何自学objective c语言?

objective-c入门

Objective-C和C的区别

objective-c与C++的区别

在 Mac OS X 上结合 Objective-C 和 C/C++

Objective-C 和 MetroWerks C/C++ IDE