在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是实际的实例。
在我看来,第三个是好的。 由于你的差异,你可以决定哪一个对你有好处。