2013-01-09 25 views
2

我是Objectivce-C的新手,我想知道在没有ARC的情况下memory managementstatic library中的正确方式是什么。 比方说我的图书馆有一个返回NSString*的方法:Objective-C静态库中的内存管理

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

所以,据我了解,因为foo分配也需要释放它的NSString(或队列它释放)。 NSString是一个返回值,所以我唯一能做的就是autorelease吧。这会产生一个问题:如果在命令行工具中使用库,开发人员需要知道foo需要@autoreleasepool,否则在主要内部@autoreleasepool内多次调用foo会吃掉内存。在我看来,就像我正在从库中将内存管理委派给应用程序似乎是一件可怕的事情。有一个更好的方法吗?或者我可以以某种方式使foo需要@autoreleasepool的开发人员明白吗?

+0

如果我们不知道您是否使用ARC,则此Q无意义。 – hooleyhoop

+3

如果他在静态库中使用'autorelease',那显然意味着他不使用ARC,不是吗? – Zaphod

+0

@hooleyhoop no ARC –

回答

2

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

但是,在任何长期运行的函数中,如命令行工具的main或后台线程,程序员有责任定期手动排除autorelease池。

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

1

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

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

原因方法并不表明他们需要一个autoreleasepool到位是因为一个autorelease池总是必须到位。

*确定您可以编写不使用autorelease的Objective-c,并且在内部变化时,您几乎可以确定的原因决不会使用autorelease。这样的代码只能使用可可的一小部分,如果有的话,可能会非常糟糕。