在ARC下创建__weak UIViewController子视图的简明代码

时间:2011-12-19 18:40:54

标签: ios automatic-ref-counting

请注意,我使用Interface Builder。

我制作了子视图__weak,以便在他们引用的对象被解除分配时,它们会在iOS 5上自动归零。这意味着我不必在viewDidUnload手动将它们归零(这似乎是最安全的模式)。

然而,因为它们很弱我不能直接将它们分配给我的ivars alloc,或者ARC立即释放它们,我发现的唯一解决方案就是分配给一个临时的强大局部变量,如下所示:

UIView *strongTmp = [[UIView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:strongTmp];
weakIVar = strongtmp;

这很难看,如果没有冗长的评论,其目的不会立即显现出来。我想要一些(更多)优雅的东西:

[self.view addSubview:weakIVar = [[UIView alloc] initWithFrame:self.view.bounds]];

但这会生成相同的编译器警告(该对象将在分配后立即释放)。

有什么建议吗?提前谢谢。

2 个答案:

答案 0 :(得分:1)

'赋值给局部变量'技术是完全正常的。只要习惯它,或使用笔尖。

答案 1 :(得分:0)

一个(非理想的)解决方案是在相关类别上添加一个类级别的初始化程序,这有效地告诉ARC返回你的东西的自动发布版本,这里有一个带有UIView的例子:

@implementation UIView (mxcl)
+ (id)viewWithFrame:(CGRect)frame {
    return [[self alloc] initWithFrame:frame];
}
@end

weakIVar = [UIView viewWithFrame:self.view.bounds];
[self.view addSubview:weakIVar];

注意:你可以在任何UIView子类上调用它,前提是子类的指定初始化程序仍然是initWithFrame。

注意,我相信我几个月前测试了这个,但是没有明确测试上面的代码,如果上面的例子需要修改,请发表评论。