2010-08-08 72 views
0

我試圖讓我的頭繞着Objective-C的內存管理。我已經使用了垃圾收集器,直到這一點,但在我繼續前進之前,我想更好地理解手動管理內存。我知道我沒有在這段代碼中執行dealloc方法。爲什麼我的保留計數爲11個變量的inputString?

我的問題是爲什麼我的inputString變量在這裏有11個保留計數?

#import "AppController.h" 


@implementation AppController 

-(id) init 
{ 
[super init]; 
NSLog(@"init"); 
speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:nil]; 
NSLog(@"speechSynth retain count is %d",[speechSynth retainCount]); 
return self; 
} 


-(IBAction) count:(id) sender 
{ 
NSString *outputString; 
int numberOfCharacters; 

inputString = [textField stringValue]; 
numberOfCharacters = [inputString length]; 
outputString = [NSString stringWithFormat:@"\"%@\" has %d characters",inputString,numberOfCharacters]; 

[label setStringValue:outputString]; 
[speechSynth startSpeakingString:outputString]; 
NSLog(@"outputString retain count is : %i",[outputString retainCount]); 
NSLog(@"inputString retain count is: %d",[inputString retainCount]); 
NSLog(@"speechSynth retain count is: %d",[speechSynth retainCount]); 
[outputString release]; 
} 
@end 

回答

3

蘋果的答案是「沒關係」。正確跟蹤您的參考資料,並讓運行時間整理其餘部分。

在內部,運行時可能會給你一個指向單個空字符串的指針(因爲NSStrings是不可變的)。或者它可能正在做別的事情。但是從剛剛分配的角度來看,一個變量引用計數背後的推理被認爲是運行時內部的,你不應該依賴它。

使用工具和殭屍對象來確定您是否泄漏或過度釋放,並假裝retainCount消息不存在。

+0

順便說一句:outputString不應該被釋放,因爲你沒有對它進行保留。它看起來像inputString,numberOfCharacters和outputString都應該是局部變量,因爲你沒有保留它們或者顯式地保留一個調用,或者通過給它們賦值一個setter方法([self setInputString:...]或者self.inputString = ...)。 – 2010-08-08 22:31:17

+2

嚴重的是,「只是假裝'retainCount'不存在」是你可以獲得的最佳建議。 'autorelease'會使保留計數無用,即使它不是已經存在的。 – Chuck 2010-08-09 04:40:18

1

你認爲inputString應該有什麼保留計數?記住你從Cocoa框架得到它,誰知道里面有多少個不同的對象引用它 - 11可能。

看看Memory Management Rules。他們根本沒有提及保留計數,這是一個很好的理由:它們幾乎沒有用作調試工具。

0

從Apple文檔:

重要提示:通常應該有 沒有理由明確要求對象 什麼它保留計數(見 retainCount)。結果往往是誤導性的,因爲您可能不知道 什麼框架對象已保留 您感興趣的對象。 在調試內存管理問題時, 您應該只關注 ,以確保您的代碼符合 所有權規則。

Apple Documentation 感謝大家的幫助。

相關問題