2013-01-09 27 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。這樣的代碼只能使用可可的一小部分,如果有的話,可能會非常糟糕。