在执行我的项目时,我想知道是否应该通过viewcontrollers @synthezied属性为viewcontroller设置我的实例变量,或者创建一个新的init函数,该函数在调用init时设置实例变量。
对我来说,似乎使用@properties设置实例变量更清晰。
您怎么看?
我不使用笔尖或故事板......
答案 0 :(得分:2)
合成属性只会让您免于编写setter和getter的麻烦。仅使用@synthesize
不会初始化您的属性。你绝对应该在-init
或者声明它们时初始化它们。
答案 1 :(得分:2)
我会在set实例变量中使用指定的初始化方法,然后可以通过@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设置为{{1},则我的第二个示例可能有问题}。
答案 2 :(得分:1)
通常,您指定的初始化程序应该只包含严格必要的参数。任何可选的东西通常都会出现在其他地方,比如是一个readwrite @property。这里有一定的余地,由你自行决定 - 有时你会包含一个可选参数,因为它实际上是在绝大部分时间内使用的(当它不是一个简单的默认值时,如nil或0)。
这个想法是由init方法返回的任何对象都应该以某种方式使用。需要额外的步骤来配置它几乎总是表明设计不佳。
遵循此原则还鼓励不可变实例(因为在许多情况下,您可以预先指定所有必要参数),这有利于多种原因 - 简单性,可预测性,线程安全性,copy-by - 等等等。
对于视图控制器,通常你会有一个初始化器,它可以控制视图,并将其他所有内容保留为@properties。您的视图控制器应该以某种身份只使用视图集;所有其他属性都应该有合理的默认值。