在做我的项目时,我想知道是否应该通过viewcontrollers @synthezied属性为viewcontroller设置实例变量,或者创建一个新的init函数,当它调用init时设置实例变量。@property或init来设置实例变量
对我来说,似乎使用@properties设置实例变量更清洁。
您认为如何?
我不使用笔尖或故事板...
在做我的项目时,我想知道是否应该通过viewcontrollers @synthezied属性为viewcontroller设置实例变量,或者创建一个新的init函数,当它调用init时设置实例变量。@property或init来设置实例变量
对我来说,似乎使用@properties设置实例变量更清洁。
您认为如何?
我不使用笔尖或故事板...
合成只是保存你写getter和setter方法的麻烦性。只使用@synthesize
不会初始化您的属性。你一定要初始化它们 - 在-init
或声明它们时。
在过去,我曾经懒惰地实例化它们,所以如果我这样做就不会有问题了:)我只是觉得初始化器的名字通常会变得非常难看。他们会像...... initwithbla bla1 bla2。如果你知道我的意思:) – WYS
我会去指定的初始化方法在设置实例变量,然后可以通过@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
,则第二个示例可能会出错。
一般而言,您指定的初始化者应该只有参数是绝对必要的。任何可选的东西通常都会到别处,比如读写@property。这里有一些余地,根据你的判断 - 有时候你会包含一个可选参数,因为它实际上是绝大多数时间使用的(当它不是它有一个简单的默认值,如零或0)。
想法是init方法返回的任何对象都应该以某种方式使用。需要额外的步骤来配置它几乎总是暗示一个糟糕的设计。
遵循这一原则还鼓励不变的情况下(因为在许多情况下,你可以指定所有前期必要的参数),这是有很多原因有利 - 简单性,可预测性,线程安全的,复制的,保留等,等等。
对于一个视图控制器具体而言,通常你会有一个视图被控制的初始化器,并将其他所有内容保留为@properties。您的视图控制器应该以某种身份,只使用视图集;所有其他财产应该有合理的违约。
你不能决定哪个更清洁。语境或代表意义将决定。请参考@Wade的回答。 – 9dan