【问题标题】:In which cases is it a good idea to relinquish using self when accessing instance variables?在哪些情况下,在访问实例变量时放弃使用 self 是个好主意?
【发布时间】:2023-03-08 13:13:01
【问题描述】:

这可能是一个非常愚蠢的初学者问题,但是:

如果你的类中有一些不错的实例变量,例如 UIScrollview *scrollView2,那么你为什么要通过放弃一个来绕过 getter 和 setter

[self.scrollView2 addSubview:imageView];

,而是做一个

[scrollView2 addSubview:imageView]; 

?我的意思是……越过吸气剂并没有什么坏处,实际上我认为这总是要走的路。但在所有苹果的例子中,我到处都错过了这种模式。他们在调用方法时很少使用 self.someInstanceVariable。还是我做错了什么?

自从苹果做以来我就开始做同样的事情,但我想知道:为什么?

【问题讨论】:

    标签: iphone cocoa cocoa-touch uikit


    【解决方案1】:

    它与KVO (Key-Value Observing)KVC (Key-Value Coding) 有关。如果绕过 getter 或 setter,观察值的对象将不会收到消息。

    【讨论】:

    • 好吧,所以在这些情况下,Apple 只是想确保没有其他人会收到通知,或者如果他们使用实例变量会怎样?访问器完成的所有内存管理工作怎么样?
    • Swanzus Longus:一个可能的原因是没有观察到该属性,所以它并不重要,并且没有访问器消息会稍微快一些(不好的原因 - 始终在任何公共属性上使用访问器消息,以防您将来开始观察它)。另一个可能的原因是它不是对象的公共属性:它只是一个 ivar,仅此而已。
    • 谢谢彼得。所以说:“如果你有公共财产,永远不要绕过访问者”是否有效?我的意思是……对我来说,绕过它们是没有意义的。这个小小的访问器调用不应该耽误太多事情......除非在某些循环每秒攻击实例变量 1000 次的环境中。
    • 尝试了一些东西后的另一个注意事项:如果您(任何人)通过不使用“self.”来绕过访问器,那么至少在您真正更改实例变量的值时不要这样做本身。即,如果您为其分配一些新对象。但是,如果您只是向实例变量指向的对象发送消息,那么访问器无论如何都无关紧要。好吧,至少在内存管理方面。即,如果您绕过具有 @property(nonatomic, retain) 的实例变量,则当您为其分配新对象时,不会保留任何内容。所以我不会绕过它们。
    【解决方案2】:

    我曾经也绕过getter/setter,直到我发现直接访问变量时绑定不起作用。换句话说,键值编码仅在使用 getter/setter 函数访问属性时才有效。

    编辑:请参阅 this page 了解 KVC 合规性。

    【讨论】:

      【解决方案3】:

      通常您不会使用initdealloc 中的属性,最好直接访问实例变量,因为您的对象可能不处于“安全”状态。

      【讨论】:

      • 我猜你的属性是指访问器的使用,对吧?
      • 对。属性可能是错误的词,如果您编写自己的访问器方法而不将其声明为属性,也是如此。
      猜你喜欢
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 2015-06-03
      相关资源
      最近更新 更多