【问题标题】:Objective C - preferred way to create and initialize an objectObjective C - 创建和初始化对象的首选方式
【发布时间】:2010-03-10 15:06:41
【问题描述】:

这两种创建和初始化对象的方法是否更可取?

MyClass oClass = [[MyClass alloc] init];
oClass.length = 5;
oClass.text = @"Hello";

或使用包含大致相同代码但看起来像这样的类方法:

MyClass oClass = [MyClass myClassWithLength:(int) 5 andText:(NSString *) @"Hello"];

当我看到事情以不止一种方式完成时,我讨厌它,我不知道其中一种是否比另一种更好,或者为什么!

【问题讨论】:

  • 你的意思是[MyClass myClassWithLength:...?
  • 从来没有一个类方法会被调用initWith...——init 方法总是实例方法。它将永远是[[MyClass alloc] initWith...]。不过,类有时会像 Ross 所询问的那样提供便利的构造函数。只是为了清楚。

标签: objective-c object creation preference


【解决方案1】:

不要成为仇恨者。 :-)

顺便说一句,我假设你的意思是:

(编辑:删除了不必要的演员表)

MyClass oClass = [[MyClass alloc] initWithLength:5 andText:@"Hello"];

多个 init... 方法的原因是为了让开发人员更方便地创建正确初始化的实例。因此,例如,如果您发现开发人员经常需要创建具有长度和文本的 MyClass 实例,您可以通过提供允许他们一步完成的 API 来简化他们的工作。如果您发现开发人员还经常需要仅使用文本字符串创建 MyClass 的实例,您还可以提供 -initWithText: 方法。

如果以这种方式创建的实例经常用作临时对象(即,不存储在实例变量或静态变量中),您还可以添加一个类便利方法,如+myClassWithText:,它返回一个自动释放的 MyClass 实例,初始化为提供的文本字符串。

至于哪个更好:尽可能完全初始化一个对象总是更好,所以如果对象需要正确初始化两个值,请使用允许您提供两个参数的方法。如果您不需要存储对正在创建的实例的引用,请使用类便捷方法,这样您的代码就不必处理内存管理。

【讨论】:

  • 好点。但似乎代码示例应该看起来像 MyClass oClass = [[MyClass alloc] initWithLength:5 andText:@"Hello"];在相应的参数之前没有 (int) 和 (NSString*) ...
【解决方案2】:

如果对象在没有长度和文本的情况下无法使用,那么第二个选项可能会更好。如果这些字段是可选的,那么第一个更好。

但是,我不认为这个问题是绝对正确的。

【讨论】:

  • 为了方便起见,一个类通常会同时提供两种选择(因此在类实现中需要一个“指定初始化器”)。
【解决方案3】:

如果您有一个具有许多属性的类,则不太可能在一行代码中将它们全部初始化。两种方式对我来说都很好。

【讨论】:

  • 没有理由假设属性和初始值之间存在一对一的映射关系,尤其是考虑到 +alloc 保证所有实例变量(除 isa 之外)都初始化为零,这对于许多属性是一个合理的默认值。但在大量初始值实际上有用的情况下,您可以考虑实现 -initWithDictionary: 方法。
【解决方案4】:

如果initWithSomething: 方法可用并且您想为这些属性提供初始值,我总是更喜欢它,因为它更简单。即使使用不可变版本的类,它也将始终有效。

但两个 init 方法本质上都不是“更好的”。类通常有一个或两个指定的初始化器,所有其他的只是调用具有默认值的初始化器——它不一定保持实例的属性不变。一个类的文档应该说明它的初始化器做什么以及哪个是该类的指定初始化器。例如,[[NSDate alloc] init] 使用 NSDate 的指定初始化器 initWithTimeIntervalSinceReferenceDate: 创建一个表示当前日期和时间的日期对象。

顺便说一句,这也意味着当你创建一个类的子类时,你只需要重写它指定的初始化器。由于其他人只是调用它,因此他们可以免费获得您的新行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2021-07-30
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多