2011-05-03 68 views
3

为什么不挽留需要在我的代码,但它的工作原理

@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

这是因为自动释放池没有时间耗尽其内容。这里是一个崩溃的例子:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
MyClass *m = [[MyClass alloc] init]; 
[m foo]; 
[pool drain]; 
[m bar]; 

保存在您的示例字符串属于99%到创建的开始事件循环的一个新池当前runloop,然后在年底水渠它的自动释放池。

+0

所以你的意思是我应该作为最佳实践下面写: 伊娃= [[NSString的stringWithString:@“伊娃”]保留]; – Howard 2011-05-03 14:13:56

+0

你知道[NSString stringWithString:@“ivar”] == @“ivar”,对吧? @“伊娃”永远不会被释放,它是您的可执行文件的一部分。 – hooleyhoop 2011-05-03 14:53:52

2

为什么不需要保留stringWithString?

因为自动释放池没有在第2行和第3行之间流失(因为只要代码将控制权返回给运行循环,它就会在Cocoa应用程序中)。

+0

所以我应该写出好的做法?伊娃= [[NSString的stringWithString:@“伊娃”]保留] – Howard 2011-05-03 16:54:43

0

看看来自苹果的Memory Management Rules。在你的情况下,你没有分配/保留/净NSString,所以你不“拥有”它,因此你不需要释放它。

在内部,NSString会返回一个自动释放对象。如果你不保留它,那么如果它被自动释放池处理,你将失去它的引用。

+1

的问题不是“为什么不让我需要释放伊娃?”,而是“为什么它似乎,即使我没有聘请伊娃工作? “这里的一些其他的答案是正确的:它的工作原理,因为伊娃指向一个自动释放的字符串,自动释放池尚未被抽干。 – Caleb 2011-05-03 14:07:26

+0

@Caleb:公平点,我误解了问题。 – Damien 2011-05-03 14:16:49

相关问题