2010-03-10 33 views
5

创建和初始化对象的两种方法之一是否更好?Objective C - 创建和初始化对象的首选方法

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

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

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

我讨厌它,当我看到的东西做的方法不止一种,我不知道,如果一个是比其他更好,或者为什么!

+0

你的意思是[MyClass myClassWithLength:...? – Ross 2010-03-10 15:11:29

+2

从来没有一个类方法被称为'initWith ...' - init方法总是实例方法。它将始终是'[[MyClass alloc] initWith ...]'。不过,类有时会提供便利的构造函数,就像罗斯在问的那样。只是要清楚。 – Chuck 2010-03-10 16:03:23

回答

8

不要成为仇敌。 :-)

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

编辑:去除不必要的管型)

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

之所以多的init ...方法是使开发人员更方便地创建正确初始化的实例。因此,例如,如果您发现开发人员经常需要创建带有长度和文本的MyClass实例,则可以通过提供允许他们一步完成该操作的API来让他们的生活更轻松。如果您发现开发人员还经常需要使用文本字符串创建MyClass的实例,那么您也可以提供一个-initWithText:方法。

如果产生这样的情况下,经常被用作临时对象(即不存储在实例变量或静态变量),你还可以添加一个类方便的方法像+myClassWithText:返回与初始化的MyClass的自动释放实例提供的文本字符串

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

+0

好点。但似乎代码示例应该看起来像MyClass oClass = [[MyClass alloc] initWithLength:5和Text:@“Hello”];在相应参数前没有(int)和(NSString *)... – Wildcat 2010-03-10 22:09:31

2

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

但是,我不认为这个问题是绝对真实的。

+1

为了方便起见,通常一个类将提供两种替代方案(因此需要在类实现中使用“指定的初始化方法”)。 – 2010-03-10 15:18:34

0

如果你有很多属性是不太可能初始化它们都在一行代码的类。这两种方式对我来说都很好。

+0

没有理由假设属性和初始值之间的一对一映射,尤其是考虑到+ alloc保证所有实例变量(isa除外)都被初始化为零,对于许多属性来说这是一个合理的默认值。但是在大量初始值实际有用的情况下,可以考虑实现-initWithDictionary:方法。 – jlehr 2010-03-10 16:17:15

0

如果initWithSomething:方法是可行的,并要为这些属性提供初始值,我总是喜欢它,只是因为它的简单。即使对于一个类的不可变版本,它也会一直工作。

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

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