2013-04-23 68 views
0

我有一個程序使用ARC並調用一些非ARC的庫方法。ARC調用非ARC非自動釋放方法

非ARC庫:

-(NSMutableData*) bar{ 
    return [[NSMutableData alloc] initWithLength:100]; 
} 

ARC計劃:

- (void)foo 
{ 
    NSMutableData* data = [d bar]; 
} 
// Data is leaked 

可以避免被泄露數據,而無需更改庫方法返回一個autoreleased對象?

當我在非ARC代碼中使用這個庫時,我用來調用數據釋放,從而避免泄漏。

+1

你非ARC庫如何被打破。修理它。如果你願意,長遠來看,你會好得多。 – bbum 2013-04-23 20:24:49

+0

基本的內存管理規則說(見http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html)「你擁有你創建的任何對象...使用方法,其名稱以「alloc」,「new」,「copy」或「mutableCopy」開頭。由於方法「bar」不是這種情況,ARC程序假定它不是在bar中實例化的對象的所有者,所以它會泄漏。正如Lithu T.V所建議的那樣,修復它的唯一正確方法是返回一個autorelease對象。 – 2013-04-23 21:09:10

+0

也有可能用NS_RETURNS_RETAINED標記該方法,這正是我正在尋找的方法。 – 2013-04-24 19:12:58

回答

2

-(NSMutableData*) bar 
{ 
    return [[[NSMutableData alloc] initWithLength:100] autorelease]; 
} 
+0

在我的問題,我寫了「沒有改變圖書館的方法」 – 2013-04-23 20:28:23

+0

@José在問題評論bbum已經說過 – 2013-04-23 20:30:37

+0

好吧,我會的事情是很多代碼取決於行爲,而且代碼也必須修復。 – 2013-04-23 20:35:01