时的这两种方式来创建和初始化对象优选一个?

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

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

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

我恨它,当我看到的东西做的方法不止一种,我不知道,如果一个比另一个,或者为什么!

更好
有帮助吗?

解决方案

别一个仇敌。 : - )

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

修改去除不需要的管型)

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

原因多初始化...方法是使其更方便地开发出正确初始化实例。因此,举例来说,如果你发现开发人员经常需要创建MyClass的实例,其长度和文字,你让他们的生活提供了一个API,允许他们这样做,一步到位更容易。如果你发现,开发商也经常需要创建的MyClass实例只是一个文本字符串,你也可能会提供一个-initWithText:方法。

和如果以此方式创建的实例经常被用作临时对象(即,不存储在实例变量或静态变量),则还可以添加像+myClassWithText:一类便利方法,它返回与所提供的初始化的MyClass一个autoreleased实例文本字符串。

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

其他提示

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

不过,我不认为这是绝对的真理了这个问题。

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

如果一个initWithSomething:方法是可行的,并要为这些属性提供初始值,我总是喜欢它,只是因为它的简单。它也将始终与一类的不可变的版本甚至工作。

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

顺便说一句,这也意味着,当你继承一个类时,你只需要覆盖其指定初始化。因为其他人只是打电话说,他们得到新的行为自由。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top