我正试图在Objective-C中解决内存管理问题。到目前为止,我已经使用了垃圾收集器,但在我前进之前,我想更好地理解手动管理内存。我知道我在这段代码中没有dealloc方法的实现。
我的问题是为什么我的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
答案 0 :(得分:3)
在内部,运行时可能会给你一个指向单例空字符串的指针(因为NSStrings是不可变的)。或者它可能正在做其他事情。但是,从您的角度来看刚刚分配的变量的引用计数背后的推理被认为是运行时内部,并且您不应该依赖它来做任何事情。
使用Instruments和zombie对象判断您是否泄漏或过度释放,并假装retainCount消息不存在。
答案 1 :(得分:1)
您认为inputString应该具有哪些保留计数?请记住,你是从Cocoa框架得到的,谁知道里面有多少不同的对象都有引用它 - 11可能。
查看Memory Management Rules。他们根本没有提到保留计数,这是有充分理由的:它们作为调试工具几乎没用。
答案 2 :(得分:0)
来自Apple文档:
重要:通常应该有 没有理由明确询问一个对象 它的保留计数是多少(见 retainCount)。结果往往是 误导,你可能不知道 什么框架对象保留 您感兴趣的对象。 在调试内存管理问题时, 你应该只关心 确保您的代码遵守 所有权规则。
Apple Documentation 感谢大家的帮助。