在存在ARC的情况下init iVar变量的正确方法是什么?

时间:2012-08-20 09:25:20

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

示例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中初始化一个Object,但哪一个是最好的做法?

2 个答案:

答案 0 :(得分:4)

在这方面,ARC与MRC相同。

您已在viewDidLoad中指定了所有这些内容。在这种情况下,请使用setter(选项2)。

如果您要在初始化程序中初始化/设置,那么您将使用直接访问。基本原因是在初始值设定项(例如-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?

答案 1 :(得分:1)

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

选项1:在初始化时,您没有使用合成器方法。所以在.h和.m

中没有使用声明属性合成器

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

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

在我看来,第三个是好的。既然你有所不同,你可以决定哪一个对你有好处。