2011-06-16 79 views
3

我正在開發一個客觀的C框架,最終將作爲靜態庫提供。但是當我在泄漏工具中將該庫集成到實際應用程序(通過添加靜態庫)時,我發現存在一些內存泄漏。以工廠方法處理內存泄漏

以下是一個示例場景。

@implementation Test 

@synthesize testNumber 

+(Test) createTestInstance { 

    Test *test = [[Test alloc] init]; 
    test.testNumber = [[NSDecimerNumber alloc] initWithInt:1]; 

    return test; 
} 

-(void) dealloc { 
    [testNumber release]; 
} 

@end 

雖然我在的dealloc釋放testNumber變量I看到的alloc位置在泄漏工具內存泄漏。這裏可能是什麼問題?

此外,因爲這是一個庫供用戶調用,是否從庫代碼中釋放這些變量是一種最佳實踐?

謝謝你

+0

這是一個單身權利?它缺少一些東西。在stackoverflow是一個問題回答最好的單身人士。只需搜索一下! – cocos2dbeginner 2011-06-16 12:44:31

+4

我在問題或代碼中沒有看到任何表示單身人士的內容。 – Caleb 2011-06-16 13:02:29

+0

這不是一個單身人士。我知道有很多問題。最好的辦法是把它變成一個實例變量。只是想在這種情況下檢查內存行爲。 – Dilshan 2011-06-16 13:29:51

回答

11

我在這裏看到兩個問題。如果testNumber是保留財產,你這個說法overretaining它:

test.testNumber = [[NSDecimerNumber alloc] initWithInt:1]; 

兩者的alloc-init和屬性訪問被保留的對象。因此,它應該是:

test.testNumber = [[[NSDecimerNumber alloc] initWithInt:1] autorelease]; 

沒有必要提及的是,你仍然需要在dealloc方法來釋放testNumber

而且,據我所知createTestInstance是一個方便的構造函數來創建Test對象,它應該根據Object Ownership Policy(僅適用於以「黃金」開頭的名稱方法返回一個自動釋放的對象,「新」,「複製」,或者「 mutableCopy」回你自己的對象):

+ (id)createTestInstance { 

    Test *test = [[[self alloc] init] autorelease]; 
    test.testNumber = [[[NSDecimerNumber alloc] initWithInt:1] autorelease]; 

    return test; 
} 

最後,@Josh卡斯韋爾的建議,方便構造函數應該返回id,而不是特定的類。從The Objective-C Programming Language

方便 構造函數的返回類型是出於同樣的原因 它是初始化方法ID,如討論 ID

而且,他們應該使用selfConstraints and Conventions。」而不是硬編碼類的名稱alloc-init實例爲了正確處理子類self這裏指的是類對象本身,因爲這是一個類方法)。

+3

+1你打敗了我。理想情況下,您不會在方法名稱中添加「create」,因爲它會根據內存管理髮送不同的消息。 – 2011-06-16 12:46:23

+0

這意味着對於init和alloc它是否將保留計數增加2? – Dilshan 2011-06-16 13:32:56

+1

使用'[NSDecimalNumber numberWithInt:1]'創建分配給'test.testNumber'的對象。 – JeremyP 2011-06-16 13:46:43