在ARC存在的情况下,初始化iVarvariables的正确方法是什么?

例如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,但哪一个是最好的做法?

在这方面,ARC和MRC一样。

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

如果您要在初始化程序中初始化/设置,那么您将使用直接访问。 基本的原因是在初始化器 (例如-init )中,你有一个部分初始化的对象。 在初始化过程中,为了正常运行,您需要关注初始化您的类需要或期望的variables。 同样,要避免在部分构build状态下使用访问器时可能遇到的副作用 。

在一个完全构造的状态下(比如viewDidLoad ),你应该把这个实现放到访问器的正确行为上,就像你的对象的接口所指定的一样。


补充阅读:

初始化一个属性,点符号

我应该在ARC的init方法中引用self.property吗?

你为什么要用伊娃?

我想你应该明白这三者之间的区别,然后决定哪一个对你有好处。

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

选项2:在这里你正在使用属性合成器。 但是访问实例和实际实例variables的方法名称是相同的。

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

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

Interesting Posts