目标C:保留vs分配 - 重新访问

时间:2010-12-23 18:09:19

标签: iphone objective-c

我想知道如何分配一个具有retain属性的对象,如下所示:

RootViewController *viewController;

@property (nonatomic, retain) RootViewController *viewController;


@implementation ...

viewController = [[RootViewController alloc] init];

因为做这样的事情是不对的:

self.viewController = [[RootViewController alloc] init];

因为这会使对象保留计数增加2,你必须释放你的对象两次,其中一个是dealloc方法。

如果我正在分配我的对象,那么使用assign属性会更好吗?或何时需要保留我使用alloc方法分配的对象。

我对这个问题非常困惑,所以请你向我举例说明这种情况是如何有效的。

提前多多感谢,我真的很感激。

此致

4 个答案:

答案 0 :(得分:7)

当您将对象传递到您希望控制它的其他位置时,autorelease标准做法是:

self.viewController = [[[RootViewController alloc] init] autorelease];

或者您可以在设置变量后自己release

RootViewController *controller=[[RootViewController alloc] init];
self.viewController = controller;
[controller release];

你的第一个例子不是必然坏习惯,尽管肯定有程序员相信它。这在很大程度上取决于背景。

在这种情况下使用assign可能会出错。

答案 1 :(得分:1)

分配是错误的。 'retain'属性表示您的对象拥有viewController的所有权。可以在初始化程序中分配它,但是'retain'属性确定在创建对象后如果将viewController设置为其他对象,会发生什么。

对于保留属性,生成的setter将如下所示:

- (void)setViewController: (UIViewController*)value
{
    if (viewController != value) {
        [viewController release];
    }
    viewController = [value retain];
}

答案 2 :(得分:1)

如果将属性设置为retain,则使用autorelease将是合适的,如下所示:

self.viewController = [[[RootViewController alloc] init] autorelease];

确保使用“自我”。以上是为了确保您使用合成的setter,它将处理保留的详细信息。

答案 3 :(得分:0)

不,你应该做的是自动释放你的RootViewController,或者在上面的情况下直接分配给ivar,你从一开始就获得对象的所有权。