【问题标题】:Whats the differences between self->_var and simple _var? [duplicate]self->_var 和简单的 _var 有什么区别? [复制]
【发布时间】:2015-09-01 19:43:51
【问题描述】:

所以如果我在 iOS 中(使用 Objective C,不确定这是否与 Swift 相同),例如

@property (nonatomic, copy) NSString *aString;

然后在我的代码中的一些地方

// Simple ivar access in some method
_aString = anyStringOrNil;

// Self-> ivar access in some other method
self->_aString = anyStringOrNil;

我想知道使用其中一种的区别

【问题讨论】:

  • 我认为这应该回答你的问题。只需Edit您的问题,如果没有,请联系我。
  • 非常感谢@JoshCaswell,我需要提高我的搜索技能!但是是的,这个实际上有答案stackoverflow.com/questions/1314173/…

标签: ios objective-c properties ivar


【解决方案1】:

正如您发布的那样,它们是相同的。然而,直接访问 ivar 和通过属性是有区别的。如果你这样设置字符串:

self.aString = someString;

这将通过自动生成的 setter,根据您的属性声明,该 setter 将复制 someString。这在使用可变字符串的情况下更可取。你不希望字符串从你下面变出来。在您使用的两个示例中,您直接将 _aString 的值设置为字符串引用,因此如果字符串是其他人拥有的可变字符串,它可能会在没有警告的情况下更改并导致意外结果。

通常更好的做法是通过 setter (self.property = foo) 而不是直接访问 ivar,因为属性的 setter 可能具有您可能想要的一些行为,直接访问它会绕过这个。当然也有需要直接访问ivar的情况,但是最好还是默认通过属性。

【讨论】:

  • 谢谢!但实际上我现在使用属性和 ivar 之间的区别,我只是想知道使用 self-> 访问 ivar 或仅使用 ivar 之间是否有任何区别,如果它们相同,那么为什么我们有两种不同的方法呢?
  • @BlackSheep 做同一件事总是有不同的方法。我上面的代码 sn-p 可以写成[self setAString:someString]。在使用取消引用设置 ivar 的情况下,如果 ivar 未使用下划线命名,则取消引用可以清除您正在设置的变量是 ivar,而无需重新命名它。一般来说,使用取消引用来获取 ivar 是我在实时代码中从未真正见过的,所以我不确定为什么会打扰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 2012-08-09
  • 1970-01-01
相关资源
最近更新 更多