我有一个班级
@implementation MyClass
- (void) foo
{
ivar = [NSString stringWithString:@"ivar"];
}
- (void) bar
{
NSLog(@"%@", ivar);
}
和main.m
MyClass * m = [[MyClass alloc] init];
[m foo];
[m bar];
为什么stringWithString不需要保留?
你能告诉我一个需要保留的例子吗?
答案 0 :(得分:4)
因为自动释放池没有时间排空其内容。这是一个崩溃的例子:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
MyClass *m = [[MyClass alloc] init];
[m foo];
[pool drain];
[m bar];
在您的示例中保存字符串的自动释放池属于当前runloop的99%,它在事件循环开始时创建一个新池,然后在最后将其排出。
答案 1 :(得分:2)
为什么stringWithString不需要保留?
因为自动释放池没有在第2行和第3行之间耗尽(因为只要你的代码将控制权返回到运行循环就会出现在Cocoa应用程序中)。
答案 2 :(得分:1)
您可以先阅读Memory Management Programming Guide并查看this教程。
答案 3 :(得分:0)
查看Apple的Memory Management Rules。在您的情况下,您没有分配/保留/净化NSString,因此您不会拥有"拥有"它因此你不需要释放它。
在内部,NSString会返回一个自动释放的对象。如果您不保留它,那么如果它被自动释放池解除分配,您将失去对它的引用。