5

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

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

或使用包含大致相同代码但如下所示的类方法:

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

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

4

4 回答 4

9

不要成为仇恨者。:-)

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

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

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

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

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

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

于 2010-03-10T15:26:49.583 回答
2

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

但是,我认为这个问题没有绝对的真理。

于 2010-03-10T15:11:57.930 回答
0

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

于 2010-03-10T15:12:47.673 回答
0

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

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

顺便说一句,这也意味着当你继承一个类时,你只需要重写它指定的初始化器。由于其他人只是这样称呼,他们免费获得您的新行为。

于 2010-03-10T16:12:43.680 回答