我試圖讓我的頭繞着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
順便說一句:outputString不應該被釋放,因爲你沒有對它進行保留。它看起來像inputString,numberOfCharacters和outputString都應該是局部變量,因爲你沒有保留它們或者顯式地保留一個調用,或者通過給它們賦值一個setter方法([self setInputString:...]或者self.inputString = ...)。 – 2010-08-08 22:31:17
嚴重的是,「只是假裝'retainCount'不存在」是你可以獲得的最佳建議。 'autorelease'會使保留計數無用,即使它不是已經存在的。 – Chuck 2010-08-09 04:40:18