我想知道如何分配一个具有retain属性的对象,如下所示:
RootViewController *viewController;
@property (nonatomic, retain) RootViewController *viewController;
@implementation ...
viewController = [[RootViewController alloc] init];
因为做这样的事情是不对的:
self.viewController = [[RootViewController alloc] init];
因为这会使对象保留计数增加2,你必须释放你的对象两次,其中一个是dealloc方法。
如果我正在分配我的对象,那么使用assign属性会更好吗?或何时需要保留我使用alloc方法分配的对象。
我对这个问题非常困惑,所以请你向我举例说明这种情况是如何有效的。
提前多多感谢,我真的很感激。
此致
答案 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,你从一开始就获得对象的所有权。