【问题标题】:Objective C NSAutoreleasePool and releaseObjective C NSAutoreleasePool 和发布
【发布时间】: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 的要点。
所以我想问这个问题以确保一切。这会造成错误吗?

【问题讨论】:

    标签: objective-c release nsautoreleasepool


    【解决方案1】:

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

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

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

    【讨论】:

    • 好吧,我在google上搜索了一些文档,发现“可以自动释放的对象释放会导致EXC_BAD_ACCESS”。并且基本上代码中的产品只是一个不需要发布的指针。但我发现很难在代码中识别哪个对象将被自动释放。在这种情况下,我会考虑如何防止这种情况。我可以在所有函数中使用 NSAutorelease 池,从不手动调用 release 并在所有返回的对象中使用 autorelease 来防止这种情况吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多