当在方法中分配局部变量,然后返回给调用者时,我对保留/释放计数有点困惑。例如
-(NSMutableString*)foo {
NSMutableString *str = [[[NSMutableString alloc] init] autorelease];
[str appendString:@"Just a test"];
return str;
}
NSMutableString *myString = [self foo];
问题:(你可以看到我对此案感到困惑) 1.当str分配给myString时,str会保留计数增量吗? 2.在这种情况下自动释放是否安全? 谁应该清理记忆?
感谢。
答案 0 :(得分:5)
我建议你阅读Cocoa memory management guidelines。你的所有问题都在那里得到解答。
回答这个特定的代码示例:它正确地管理内存。这就是autorelease的用途 - 你需要一个对象来粘贴特定的方法调用,但仍然会被释放。您基本上将所有权转为自动释放池。
保留和释放没有魔力。分配局部变量不会影响对象的保留计数 - 必须发送retain
或release
才能实现。
答案 1 :(得分:2)
没有特别的魔法。
retain
消息时,其保留计数会增加。release
消息时,其保留计数会减少。autorelease
消息时,它会将自己添加到池中。release
消息。release
个消息的消息时(假设retain
引起了隐式retain
),该对象会发送一个{alloc
消息1}}消息。否则对象的保留计数不受影响(除非进行任何优化)。
答案 2 :(得分:1)
1)否
2)是的 - 这是这种情况的正确模式。 (您不希望调用者必须跟踪和释放此NSMutableString实例)
NSMutableString *str = [[NSMutableString alloc] init];
return str;
会很糟糕,因为你的调用者现在被迫管理返回的变量。