2012-02-15 80 views
0

内的初始化方法,我有以下的代码非保留对象:何时被释放?

- (id)init { 

    self = [super init]; 

    if (self) { 

     UIButton *tempButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     tempButton.frame = CGRectMake(0,0,300,44); 

     // some custom code... 

     self.myButton = tempButton; 
    } 

    return self; 
} 

myButton是保留的财产。 我知道,对于所关注的内存管理规则,这种方法等于这个其他:

- (id)init { 

    self = [super init]; 

    if (self) { 

     UIButton *tempButton = [[UIButton alloc] initWithFrame:CGRectMake(0,0,300,44)]; 

     // some custom code... 

     self.myButton = tempButton; 
     [tempButton release]; 
    } 

    return self; 
} 

但在这种情况下,我需要使用的第一个“版本”,因为buttonType属性为只读后,我不能改变它使按钮失去活力。

因为我发现自己在我的应用程序和多个对象(其中大部分是NSString)的多个方法中使用“非init-release”版本,我的问题是:不计算在这种情况下,分配给属性保留的对象,何时tempButton对象将被释放?也许在方法/ if语句的末尾?或者,第一个“版本”会导致内存使用量增加,因为该对象不会立即被释放,而是在一段时间之后?

回答

1

我觉得你在这里有点困惑:在你的两个片段中,你创建了一个tempButton对象,但是你将它分配给self.myButton。此时,tempButtonself.myButton都是指向同一对象的指针。现在,大概你使用的是一个强大的属性,所以通过给它分配tempButton,你增加了它的保留计数,因此在任何版本的代码中,最后的保留计数都是+1,并且不会被解除分配。

如果,假设,myButton没有一个强大的属性,那么就在你的代码中的错误,并在这两种情况下tempButton将被提前释放和dealloc'ed。下面是在两种情况下会发生什么:

在你的第一个版本,因为你得到tempButton来自比initcopy方法以外的东西,它得到+1保留计数,但会被自动释放。在运行循环的当前迭代结束时,autorelease将启动,使其保留计数为0并导致它被释放。

在第二个版本中,您首先得到保留数为1的tempButton,因为它来自init方法。但后来你明确地释放它,将其保留计数设置为0,此时立即释放它。

+0

唉,我错过了运行循环部分。你有可能对“运行循环的当前迭代”更精确吗?那个迭代与单一方法或更长的时间相关,也许是固定的时间?可能是整个应用程序的生命周期?我试着通过阅读教程来了解更多,但没有人明确地解释这一点。 – 2012-02-15 00:19:02

+0

“运行循环的当前迭代”实际上与我所能达到的一样精确。运行循环是Cocoa中的事件处理循环。如果您想了解更多信息,请点击以下博客文章:http://blog.shinetech.com/2009/06/02/run-loops-vs-threads-in-cocoa/ – yuji 2012-02-15 00:26:12

-1

非init方法是完全一样的:

UIButton *tempButton = [[[UIButton alloc] initWithFrame:CGRectMake(0,0,300,44)] autorelease]; 

这样的想法是,以了解更多关于自动释放池是如何工作的,它是非常有用的大部分时间,但ü需要了解如何它的工作原理ü稍后将在应用程序中使用该对象。 并注意一些事情,当你添加临时按钮到你认为该视图将保留它,并将其释放它时,你可以使用仪器和检查对象的保留计数,如果你想查看如何释放/如果你想要看到它在实施,保留正在进行。