为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我不应该在init/dealloc中使用目标C2.0访问器?

为什么我不应该在init/dealloc中使用目标C2.0访问器?

扬帆大鱼 2019-07-15 16:17:33
为什么我不应该在init/dealloc中使用目标C2.0访问器?在……里面@mmalc‘s 反应到这个问题他说:“一般来说,你应该不在dealloc(或init)中使用访问器方法。我能想到的唯一真正的原因是性能和避免@Dynamicsetters的未知副作用。
查看完整描述

3 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

这一切都是关于使用习惯性一致的代码。如果您对所有代码进行了适当的格式化,那么就有一组规则可以保证在init/dealloc中使用访问器是安全的。

最大的问题是(正如mmalc所说),设置属性默认状态的代码不应该通过访问器,因为它会导致各种讨厌的问题。问题是,没有必要设置属性的默认状态。由于许多原因,我一直使用自初始化的访问器,如下所示:

- (NSMutableDictionary *) myMutableDict {
    if (!myMutableDict) {
        myMutableDict = [[NSMutableDictionary alloc] init];
    }

    return myMutableDict;}

这种类型的属性初始化允许一个人推迟许多可能实际上不需要的init代码。在上述情况下,init不负责引入属性状态,而且在init方法中使用访问器是完全安全的(甚至是必要的)。

诚然,这确实对您的代码施加了额外的限制,例如,对于超类中的属性,带有自定义访问器的子类必须调用超类访问器,但这些限制并不与Cocoa中常见的其他各种限制不一致。


查看完整回答
反对 回复 2019-07-15
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

你回答了你自己的问题:

  1. 性能本身可能是一个非常充分的理由(特别是如果您的访问器是原子的)。
  2. 您应该避免访问器可能产生的任何副作用。

如果您的类可能被子类化,则后者尤其是一个问题。

但是,还不清楚为什么这一问题被专门用于目标-C2访问器?无论您是使用声明的属性还是自己编写访问器,都适用相同的原则。


查看完整回答
反对 回复 2019-07-15
  • 3 回答
  • 0 关注
  • 453 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信