示例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,但哪一个是最好的做法?
答案 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?
答案 1 :(得分:1)
我认为你应该理解这三者之间的区别,然后决定哪一个对你有好处。
选项1:在初始化时,您没有使用合成器方法。所以在.h和.m
中没有使用声明属性合成器选项2:这里使用的是属性合成器。但是访问实例和实际实例变量的方法的名称是相同的。
选项3:这里再次使用属性合成器方法。这里foo是方法的名称,_foo是实际的实例。
在我看来,第三个是好的。既然你有所不同,你可以决定哪一个对你有好处。