Objective c 为什么变量inputString 11的保留计数在这里?

Objective c 为什么变量inputString 11的保留计数在这里?,objective-c,memory-management,Objective C,Memory Management,我正试图了解Objective-C中的内存管理。到目前为止,我一直在使用垃圾收集器,但在继续之前,我想更好地了解手动管理内存。我知道在这段代码中没有dealloc方法的实现 我的问题是为什么我的inputString变量在这里的保留计数是11 #import "AppController.h" @implementation AppController -(id) init { [super init]; NSLog(@"init"); speechSynth = [[NSSpeec

我正试图了解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
苹果的回答是“没关系”。正确跟踪你的引用,让运行时来整理其余的

在内部,运行时可能会给您一个指向单例空字符串的指针(因为NSStrings是不可变的)。或者它可能在做别的事情。但是,从您的角度来看,刚刚分配的变量的引用计数背后的推理被认为是运行时内部的,您不应该依赖它来做任何事情

使用工具和僵尸对象来确定你是在泄漏还是过度释放,并假装retainCount消息不存在。

苹果的答案是“没关系”。正确跟踪你的引用,让运行时处理其余的

在内部,运行时可能会给您一个指向单例空字符串的指针(因为NSStrings是不可变的)。或者它可能在做别的事情。但是,从您的角度来看,刚刚分配的变量的引用计数背后的推理被认为是运行时内部的,您不应该依赖它来做任何事情


使用工具和僵尸对象来确定您是在泄漏还是过度释放,并假装retainCount消息不存在。

您认为inputString应该有多少保留计数?请记住,它是从Cocoa框架中获得的,谁知道其中有多少不同的对象引用了它-可能是11


看这张照片。它们根本没有提到保留计数,这是出于一个很好的原因:它们作为调试工具几乎毫无用处。

您认为inputString应该具有什么样的保留计数?请记住,它是从Cocoa框架中获得的,谁知道其中有多少不同的对象引用了它-可能是11


看这张照片。它们根本没有提到保留计数,这是出于一个很好的原因:它们作为调试工具几乎毫无用处。

来自苹果文档:

重要提示:通常应该有 没有明确询问对象的理由 其保留计数是多少(参见 重新计算)。结果往往是 误导,因为你可能不知道 保留了哪些框架对象 您感兴趣的对象。 在调试内存管理问题时, 你应该只关心 确保您的代码符合 所有权规则


谢谢大家的帮助。

来自苹果文档:

重要提示:通常应该有 没有明确询问对象的理由 其保留计数是多少(参见 重新计算)。结果往往是 误导,因为你可能不知道 保留了哪些框架对象 您感兴趣的对象。 在调试内存管理问题时, 你应该只关心 确保您的代码符合 所有权规则


谢谢大家的帮助。

顺便说一句:outputString不应该被释放,因为您还没有对它进行保留。看起来inputString、numberOfCharacters和outputString都应该是局部变量,因为您不是通过调用retain显式地保留它们,也不是通过setter方法([self-setInputString:…]或self.inputString=…)隐式地分配它们。说真的,“只要假装
retainCount
不存在就可以了。”这是你在这个话题上能得到的最好的建议
autorelease
会使保留计数无法查看,即使它尚未显示。顺便说一句:outputString不应被释放,因为您尚未对其进行保留。看起来inputString、numberOfCharacters和outputString都应该是局部变量,因为您不是通过调用retain显式地保留它们,也不是通过setter方法([self-setInputString:…]或self.inputString=…)隐式地分配它们。说真的,“只要假装
retainCount
不存在就可以了。”这是你在这个话题上能得到的最好的建议
autorelease
将使保留计数无法查看,即使它尚未显示。