【问题标题】:@property or init to set instance variables@property 或 init 设置实例变量
【发布时间】:2012-11-29 13:54:40
【问题描述】:

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

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

你怎么看?

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

【问题讨论】:

  • 您无法决定哪个更清洁。上下文或代表意义将决定。参考@Wade 的回答。

标签: objective-c xcode


【解决方案1】:

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

【讨论】:

  • 过去我常常懒惰地实例化它们,所以如果我这样做就不会成为问题 :) 我只是认为初始化器的名称通常会变得非常难看。他们会像... initwithbla bla1 bla2。如果你知道我的意思:)
【解决方案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,我的第二个示例可能会出错。

【讨论】:

  • 只是指定的初始化程序永远不会看起来太漂亮。看看我上面的评论:)但我明白你的意思:)
  • 您不会过多地使用它们。如果您多次使用具有相同参数的初始化程序 - 在 ViewController 的类上创建静态工厂方法是否有意义?
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2010-10-24
    • 2014-02-25
    相关资源
    最近更新 更多