Ios IBOutlet和viewDidUnload在ARC下

Ios IBOutlet和viewDidUnload在ARC下,ios,weak-references,iboutlet,automatic-ref-counting,Ios,Weak References,Iboutlet,Automatic Ref Counting,这里有一个类似的问题,但我只想澄清一些没有完全解释的问题 我理解,所有的代理和出口——事实上,任何对“父”对象的引用,为了成为一个好公民并思考一下对象图——都应该将弱引用归零。由于在被引用对象的保留计数达到零时,将弱指针归零会自动降至零,这是否意味着现在不需要在viewDidUnload中将IBOutlets设置为零 因此,如果我这样声明我的出口: @property (nonatomic, weak) IBOutlet UILabel *myLabel; 以下代码是否有效 - (void)v

这里有一个类似的问题,但我只想澄清一些没有完全解释的问题

我理解,所有的代理和出口——事实上,任何对“父”对象的引用,为了成为一个好公民并思考一下对象图——都应该将弱引用归零。由于在被引用对象的保留计数达到零时,将弱指针归零会自动降至零,这是否意味着现在不需要在
viewDidUnload
中将IBOutlets设置为零

因此,如果我这样声明我的出口:

@property (nonatomic, weak) IBOutlet UILabel *myLabel;
以下代码是否有效

- (void)viewDidUnload
{
    self.myLabel = nil;

    [super viewDidUnload];
}

只是做点调查

据我所知,弱与赋值相似,因为它们都是弱引用

但是,assign不会创建归零引用。i、 e.如果所讨论的对象被销毁,并且您访问了该属性,您将得到一个
坏访问\u异常

弱特性在其引用的对象被销毁时自动归零(=nil)

在这两种情况下,都没有必要将属性设置为nil,因为它不会影响所讨论对象的保留计数。使用“保留属性”时,这是必需的

显然,ARC还引入了一个新的“强”属性,它与“保留”相同


完成的研究

我做了一些测试,结果显示
viewDidUnload
方法中的代码是不必要的。为了支持这一点,
viewDidUnload
的文档实际上会说:

调用此方法时,视图属性为nil


表示弱引用必须已自动设置为
nil

根据我对ARC中插座管理方式的理解,如果您使用弱引用,则无需向viewDidUnload添加任何内容,因为它已经为nil。这样做是多余的


然而,如果你确实拥有强大的销售渠道,苹果公司说如果你指向nib中的顶级项目,你应该这样做,那么你肯定应该继续在viewDidUnload中添加适当的行来消除这些渠道

我有一些经验证据支持IBOutlets确实已经自动设置为零。以下是我所做的:

  • 我为我的IBOutlet属性设置了显式ivar(
    @synthesis myLabel=myLabel_uz
    ),以便以后在调试器中检查它们的值
  • 我在
    viewDidUnload
    的第一行启用了断点
  • 我通过模拟内存警告来安排调用
    viewDidUnload
  • 我检查了与IBOutlet属性关联的显式ivar的值

  • 显式IVAR都有
    nil
    作为其值,然后我点击了断点。

    从iOS 5和OS X 10.7开始,
    将生成自动归零指针。这意味着当释放指向的对象时,指针将自动设置为
    nil
    (有关详细信息,请参阅)


    因此,在iOS 5+和OS X 10.7+下,在
    viewDidUnload
    方法中手动将
    weak
    IBOutlet
    属性设置为
    nil
    是没有用的:卸载主视图时,将释放其所有子视图,因此,相关属性设置为
    nil

    我想知道否决票的原因?我对答案也很好奇,所以我投票反对。我不知道答案…谢谢你的回复。我理解弱引用的工作原理,我的问题更多地与
    viewDidUnload
    的底层机制有关。换句话说,视图是否总是在调用
    viewDidUnload
    后直接强制弱引用
    nil
    ?我的理解是,视图及其子视图在从显示中删除时将被释放。因为,弱函数不增加释放计数,并且当它的引用被破坏时会被归零,所以它应该没有必要。对不起,我第一次读它时一定错过了你答案的那部分。这也是我的理解。但是为什么Xcode在创建弱输出时在
    viewDidUnload
    中插入
    [self-setMySubview:nil]
    语句呢?我认为这可能是弧前代码遗留下来的一个功能,与要求Xcode为核心数据生成
    NSManagedObject
    子类的方式相同,生成的属性设置为
    retain
    ,而不是
    strong
    。尽管在插座的情况下,它们被创建为
    。我猜这是无意的,我同意。在拖放代码以创建出口时,Interface Builder UI可能会出现警告错误。只要您在讨论中的插座上使用ARC和弱引用,就可以安全地删除这些nil设置,是否需要定义
    self.myLabel=nil在函数
    viewDidUnload
    中。