1

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

4

2 回答 2

4

在这方面,ARC 与 MRC 相同。

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

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

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


补充阅读:

初始化属性,点表示法

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

为什么要使用 ivar?

于 2012-08-20T09:30:18.773 回答
1

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

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

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

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

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

于 2012-08-20T09:56:48.787 回答