Objective c 为什么变量inputString 11的保留计数在这里?
我正试图了解Objective-C中的内存管理。到目前为止,我一直在使用垃圾收集器,但在继续之前,我想更好地了解手动管理内存。我知道在这段代码中没有dealloc方法的实现 我的问题是为什么我的inputString变量在这里的保留计数是11Objective 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
#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
将使保留计数无法查看,即使它尚未显示。