Objective C - 创建和初始化对象的首选方法

时间:2010-03-10 15:06:42

标签: objective-c object creation preference

创建和初始化对象的两种方法之一是更好吗?

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

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

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

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

4 个答案:

答案 0 :(得分:9)

不要成为仇敌。 : - )

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

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

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

多个init ...方法的原因是为了让开发人员更方便地创建正确初始化的实例。因此,例如,如果您发现开发人员经常需要使用长度和文本创建MyClass实例,那么通过提供允许他们在一个步骤中执行此操作的API,您可以更轻松地生活。如果您发现开发人员经常需要仅使用文本字符串创建MyClass实例,您也可以提供-initWithText:方法。

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

如果你有一个包含许多属性的类,则不可能在一行代码中初始化它们。这两种方式都适合我。

答案 3 :(得分:0)

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

但是init方法本身并不“更好”。类通常有一个或两个指定的初始值设定项,而所有其他类只调用那些具有默认值的类 - 它不一定会保持实例的属性不变。类的文档应该指出它的初始化程序做了什么,以及哪个是类的指定初始化程序。例如,[[NSDate alloc] init]使用NSDate的指定初始值设定项initWithTimeIntervalSinceReferenceDate:来创建表示当前日期和时间的日期对象。

顺便说一下,这也意味着当你对一个类进行子类化时,你只需要覆盖它指定的初始化器。由于其他人只是称之为,所以他们可以免费获得新的行为。