2012-11-29 99 views
3

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

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

您认为如何?

我不使用笔尖或故事板...

+0

你不能决定哪个更清洁。语境或代表意义将决定。请参考@Wade的回答。 – 9dan

回答

2

合成只是保存你写getter和setter方法的麻烦性。只使用@synthesize不会初始化您的属性。你一定要初始化它们 - 在-init或声明它们时。

+1

在过去,我曾经懒惰地实例化它们,所以如果我这样做就不会有问题了:)我只是觉得初始化器的名字通常会变得非常难看。他们会像...... initwithbla bla1 bla2。如果你知道我的意思:) – WYS

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 

根据实现您的initialisers您可以设置属性的默认值,而不将它们作为PARAMS到初始化器也一样,所以我如果init默认将参数1设置为@foo并将参数2设置为@5,则第二个示例可能会出错。

+0

这只是指定的初始化者永远不会看起来太漂亮。看看我上面的评论:)但我明白你的意思:) – WYS

+0

你不会使用它们太多。如果您使用相同的参数很多次使用初始化程序 - 可能是在ViewController的类上创建静态工厂方法是有意义的? – Eimantas

1

一般而言,您指定的初始化者应该只有参数是绝对必要的。任何可选的东西通常都会到别处,比如读写@property。这里有一些余地,根据你的判断 - 有时候你会包含一个可选参数,因为它实际上是绝大多数时间使用的(当它不是它有一个简单的默认值,如零或0)。

想法是init方法返回的任何对象都应该以某种方式使用。需要额外的步骤来配置它几乎总是暗示一个糟糕的设计。

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

对于一个视图控制器具体而言,通常你会有一个视图被控制的初始化器,并将其他所有内容保留为@properties。您的视图控制器应该以某种身份,只使用视图集;所有其他财产应该有合理的违约。