2010-06-30 64 views
1

我這個簡單的代碼的Xcode工具泄漏不能識別財產泄漏

@interface chatApp4Message : NSObject { 
NSString* line; 
} 
@property (nonatomic, retain) NSString* line; 
@end 

@implementation chatApp4Message 
@synthesize line; 
@end 

正如你所看到的,我不釋放行屬性。但是,在運行下的Xcode工具泄漏下面這個簡單的代碼的時候,我沒有得到任何的內存泄漏跡象

for (int i=1; i< 100; i++){ 
    chatApp4Message* msg = [[chatApp4Message alloc] init]; 
    msg.line = @"aaaaaa"; 
    [msg release] 
} 

回答

2

其實有一個在你的代碼中沒有內存泄漏。 @「aaaaaa」是一個字符串字面值對象,在編譯時創建,並且在應用程序運行時它一直存在。然而,改變你的代碼,真正創建字符串對象,你會得到內存泄漏:

for (int i=1; i< 100; i++){ 
    chatApp4Message* msg = [[chatApp4Message alloc] init]; 
    msg.line = [NSString stringWithFormat:@"%d", i]; // It leaks! 
    [msg release] 
} 

P.S.可能this discussion對字符串文字將是有益的......

+0

真的?我認爲@ @ synthesize''d'@property(retain)'會釋放它的ivar,然後保留新的。沒有泄漏,直到dealloc,並且只有當'[line release]'丟失..並且當然'line = nil'在初始化過程中保持安全和整潔 – ohhorob 2010-06-30 15:48:47

+0

這都是真的,爲了正確處理內存,您需要釋放line ivar dealloc方法。我只是試圖解釋(可能很糟糕 - 抱歉,我不是母語的人)爲什麼在**那個特定的例子中沒有內存泄漏。字符串文字的行爲不像普通的動態創建的obj-c對象(參見發佈的鏈接) - 例如,您可以嘗試釋放/保留字符串文字並檢查它們是否不影響文字的保留計數。 – Vladimir 2010-06-30 16:14:31

+0

即使您沒有在chatApp4Message類中重寫它,dealloc方法也會在[msg發佈]後立即調用。無論如何,ivars(至少是obj-c對象)默認初始化爲nil - 你不需要在init方法中將它們設置爲nil。 – Vladimir 2010-06-30 16:19:30

2
  1. 您的代碼在技術上漏水你認爲的原因,但儀器是測量現實,而不是理論。如果您要在代碼上運行靜態分析器(Build &分析),它應該檢測到泄漏。

  2. 字符串文字 - @"...." - 是實際編譯的靜態NSString實例。在運行時,[@"foo" class]將指示該字符串是NSCFConstantString(IIRC - 無論如何都是一些常量字符串類)的實例,它在retainreleaseautorelease上什麼都不做,因爲它實際上並不是一個已分配的實例。

  3. 如果您想玩Leaks分析,請使用可變字符串或您創建的某個類的實例。

我經常使用類似下面的,以生成可變自識別字符串實例與泄漏或對象圖分析,以futz的函數:

NSString *testString(NSString *prefix) { 
    NSMutableString *s = [NSMutableString stringWithString: prefix]; 
    [s appendFormat: @" (%p)", s]; 
    return s; 
}