3

在做我的项目时,我想知道是否应该通过 viewcontrollers @synthezied 属性为 viewcontroller 设置我的实例变量,或者创建一个新的 init 函数,该函数在调用 init 时设置实例变量。

对我来说,使用@properties 设置实例变量似乎更干净。

你怎么看?

我不使用笔尖或情节提要...

4

3 回答 3

2

合成属性只是让您免于编写 setter 和 getter 的麻烦。仅使用@synthesize不会初始化您的属性。您绝对应该初始化它们 - 无论是在-init声明它们时还是在声明它们时。

于 2012-11-29T13:58:34.150 回答
2

我会选择指定的初始化方法,就像设置实例变量一样,然后可以通过@synthesized属性使用。初始化视图控制器然后设置其属性会使对象处于不一致的状态。

指定初始化器:

MyViewController * viewController = [[MyViewController alloc] initWithParam1:@"foo" param2:@5];
// now viewController is consistent as presumably it has all properties set

通过 setter 设置属性:

MyViewController * viewController = [[MyViewController alloc] init];
// here viewController is inconsistent as it does not have default properties set
[viewController setParam1:@"foo"];
[viewController setParam2:@5];
// only here viewController is consistent and can be used normally

根据初始化程序的实现,您可以为属性设置默认值,而不将它们作为参数传递给初始化程序,因此如果 init 将 param1@foo和 param2静默设置为 ,我的第二个示例可能会出错@5

于 2012-11-29T14:02:44.850 回答
1

一般来说,您指定的初始化程序应该只具有严格必要的参数。任何可选的东西通常都会放在其他地方,比如作为一个可读写的@property。这里有一定的余地,由您自行决定 - 有时您会包含一个可选参数,因为它实际上在绝大多数时间都在使用(如果不是,它有一个简单的默认值,如 nil 或 0)。

这个想法是任何由 init 方法返回的对象都应该以某种方式使用。需要额外的步骤来配置它几乎总是表明设计不佳。

遵循这一原则也鼓励不可变实例(因为在许多情况下,您可以预先指定所有必要的参数),这有很多原因 - 简单性、可预测性、线程安全性、保留复制等,等等。

具体来说,对于视图控制器,通常你会有一个初始化程序,它接受要控制的视图,并将其他所有内容保留为 @properties。你的视图控制器应该在某种程度上只使用视图集;所有其他属性都应该有合理的默认值。

于 2012-11-29T16:43:37.010 回答