【问题标题】:What is the correct way of init iVar variables in presence of ARC在存在ARC的情况下初始化iVar变量的正确方法是什么
【发布时间】:2012-08-15 15:14:28
【问题描述】:

示例 iVar foo,

@property (nonatomic) NSString* foo; // inside .h

选项 1

@Synthesize foo; //Inside .m 

foo = [[NSString alloc] init]; // viewDidLoad method

选项 2

@Synthesize foo; //Inside .m 

self.foo = [[NSString alloc] init]; // viewDidLoad method

选项 3

@Synthesize foo = _foo; //Inside .m 

_foo = [[NSString alloc] init]; // viewDidLoad method

为什么?

我在很多地方都看到过代码,这些代码有不同的方法在 Obj - C 中初始化一个对象,但哪一种是最佳实践?

【问题讨论】:

  • 那些NSString 属性应该是copy,顺便说一句

标签: objective-c ios initialization automatic-ref-counting ivar


【解决方案1】:

在这方面,ARC 与 MRC 相同。

您已指定所有这些都发生在viewDidLoad。在这种情况下,请使用 setter(选项 2)。

如果您要在初始化程序中进行初始化/设置,那么您将使用直接访问。基本原因是在 initializer(例如-init)中,您有一个部分初始化的对象。在初始化期间,您希望专注于初始化您的类需要或期望的变量,以便正确运行。同样,您要避免在部分构造状态下使用访问器时可能遇到的side-effects

在完全构造的状态下(例如viewDidLoad),您应该将实现委托给访问器以获得正确的行为,如您的对象接口所指定的那样。


补充阅读:

Initializing a property, dot notation

Should I refer to self.property in the init method with ARC?

Why would you use an ivar?

【讨论】:

  • viewDidLoad 只是一个示例,init 可以在代码中的任何位置。只需要知道正确的方法即可。或者正确的方法取决于在哪里进行初始化?
  • @Owl 是的,这取决于。我扩大了我的答案。最大的区别是部分初始化(例如-init)或解构(dealloc)状态。在这些情况下,您将使用直接访问。当您拥有一个功能齐全的对象时,请使用访问器。
  • 我会挖掘一些相关的帖子
  • 感谢贾斯汀,帮了大忙!
【解决方案2】:

我认为你应该了解这三者之间的区别,然后决定哪一个对你有好处。

选项1:在初始化时,您没有使用合成器方法。所以在 .h 和 .m 中声明属性合成器是没有用的

选项 2:这里您使用的是属性合成器。但是访问实例的方法名和实际的实例变量是一样的。

选项 3:这里您再次没有使用属性合成器方法。这里 foo 是方法的名称,_foo 是实际的实例。

在我看来,第三个是好的。由于您的差异,您可以决定哪一个对您有好处。

【讨论】:

  • @Justin 好的,很抱歉造成误解。
猜你喜欢
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2021-05-04
  • 2017-10-03
相关资源
最近更新 更多