非保留对象:何时释放?

时间:2012-02-15 00:01:49

标签: ios memory-management retain

在初始化方法中,我有以下代码

- (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属性是只读的,并且在按钮初始化后我无法更改它。

由于我发现自己在我的应用程序中使用多个方法的“非init-release”版本,并且对于多个对象(大多数是NSString),我的问题是:在这种情况下不计算当tempButton对象被释放时,赋值给保留对象的属性?也许在方法/ if语句的末尾?或者第一个“版本”是否会导致内存使用量增加,因为对象没有立即释放但是经过一段时间后会被释放?

2 个答案:

答案 0 :(得分:1)

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

假设myButton不是一个强大的属性,那么代码中就会出现错误,并且在这两种情况下tempButton都会过早释放并解除分配。以下是两种情况下会发生的情况:

在您的第一个版本中,由于您tempButton来自initcopy方法之外的其他内容,因此保留计数为+1,但会自动释放。在运行循环的当前迭代结束时,自动释放将启动,使其保留计数为0并使其被解除分类。

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

答案 1 :(得分:-1)

非init方法与:

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

因此,我们的想法是更多地了解自动发布池的工作原理,大部分时间都非常有用,但是你需要了解它是如何工作的,因为你将在应用程序中使用该对象。 并注意一些事情,当你将临时按钮添加到你的视图将保留它的视图时,并且当它从中删除时将释放它,你可以使用乐器并检查对象的保留计数,如果你想查看如何释放/如果你想看到它正在发挥作用,就会继续保留。