2

我对这个很陌生,我想知道在没有 ARC的情况下Objectivce-C正确的方法是什么。可以说我的库有一个返回的方法:memory managementstatic libraryNSString*

- (NSString *) foo
{
    ...
    NSString *result = [[NSString alloc] initWithString:@"bar"];
    return [result autorelease];
}

据我了解,由于foo分配了NSString它,它还需要释放它(或排队等待释放)。NSString是一个返回值,所以我唯一能做的就是autorelease它。这就产生了一个问题:如果在命令行工具中使用库,开发人员需要知道foo需要在 main 内多次@autoreleasepool调用,否则会占用内存。在我看来,这就像我将内存管理从库委托给应用程序,这似乎是一件可怕的事情。有一个更好的方法吗?或者我可以以某种方式让需要的开发人员显而易见吗?foo@autoreleasepoolfoo@autoreleasepool

4

2 回答 2

2

自动释放池不会自动释放对象;它们需要手动排水。在 Cocoa 应用程序中,这是由主线程的运行循环完成的,因此通常大多数开发人员不必为此做任何事情,也不知道这一点。

但是,在任何长时间运行的函数中,例如命令行工具main或后台线程,定期手动清空自动释放池是程序员的责任。

您正在遵循全局内存管理规则,这是正确的做法。没有必要改变任何东西;这与 ARC 或静态库无关。

于 2013-01-09T10:06:08.050 回答
1

每个线程都需要一个 autoreleasepool*。如果您的代码被调用并且没有适当的池,则线程没有正确设置,这是程序员错误。

除非您创建了线程(或进程),否则这不是您的责任,并且与您的惰性内存管理无关。

方法没有表明它们需要一个自动释放池的原因是因为一个自动释放池总是必须就位。

*当然你可以编写不使用自动释放的Objective-c,而且你几乎可以肯定地推断,当内部发生变化时,你永远不会使用自动释放。这样的代码只能使用 Cocoa 的一小部分(如果有的话),而且可能非常糟糕。

于 2013-01-12T09:40:38.607 回答