Ios ARC下创建_u弱UIViewController子视图的简明代码

Ios ARC下创建_u弱UIViewController子视图的简明代码,ios,automatic-ref-counting,Ios,Automatic Ref Counting,请注意,我不是使用Interface Builder 我已使我的子视图\uuu变弱,这样当它们引用的对象被释放时,它们在iOS 5上会自动归零。这意味着我不必在viewDidUnload中手动将它们归零(这似乎是采用的最安全的模式) 然而,由于它们很弱,当我alloc它们时,我无法直接将它们分配给我的IVAR,或者ARC立即释放它们,我找到的唯一解决方案是分配给一个临时的强局部变量,如下所示: UIView *strongTmp = [[UIView alloc] initWithFrame:s

请注意,我不是使用Interface Builder

我已使我的子视图
\uuu变弱
,这样当它们引用的对象被释放时,它们在iOS 5上会自动归零。这意味着我不必在
viewDidUnload
中手动将它们归零(这似乎是采用的最安全的模式)

然而,由于它们很弱,当我
alloc
它们时,我无法直接将它们分配给我的IVAR,或者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]];
但这会生成相同的编译器警告(对象将在赋值后立即释放)


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

将“分配给局部变量”技术完全正常。只要习惯它,或者使用nib。

将“分配给局部变量”技术完全正常。只要习惯它,或者使用nib。

一个(非理想)解决方案是在相关类别上添加类级初始值设定项,这有效地告诉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];
注意:只要子类的指定初始值设定项仍然是initWithFrame,就可以在任何UIView子类上调用它

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

一个(非理想)解决方案是在相关类别上添加类级初始值设定项,这有效地告诉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];
注意:只要子类的指定初始值设定项仍然是initWithFrame,就可以在任何UIView子类上调用它


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

嘿,Brad/Max,你找到这个问题的答案了吗?我只是在一些地方遇到了这样的情况,这确实是非常丑陋和恼人的。嘿,布拉德/马克斯,你找到这个问题的答案了吗?我只是在一些地方遇到了这样的情况,这确实是非常丑陋和恼人的。