为什么我的代码中不需要保留但它有效

时间:2011-05-03 13:54:12

标签: iphone objective-c ios

我有一个班级

@implementation MyClass

- (void) foo    
{    
    ivar = [NSString stringWithString:@"ivar"];
}

- (void) bar    
{    
    NSLog(@"%@", ivar);
}

和main.m

MyClass * m = [[MyClass alloc] init];
[m foo];
[m bar];

为什么stringWithString不需要保留?

你能告诉我一个需要保留的例子吗?

4 个答案:

答案 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会返回一个自动释放的对象。如果您不保留它,那么如果它被自动释放池解除分配,您将失去对它的引用。