2010-11-03 58 views
6

如果我们不想在我们的类中实现init方法,并且记住NSObject中的init只返回没有初始化的对象的一个​​实例,如果我们已经获得了实例,我没有看到调用init的要点与分配。我已经尝试过,但它确实有效,但我不确定它不会导致未来的问题。只有在没有初始化的情况下才使用alloc才行吗?

myClass *newObject = [myClass alloc]; 

代替:

myClass *newObject = [[myClass alloc] init]; 

非常感谢。

回答

16

不,只要拨打alloc就不正确。 alloc将对象的所有实例变量清零,然后有机会将全部或部分实例变量设置为其默认值。有些类甚至使用它们的init方法来创建另一个实例,并返回该实例而不是您分配的实例。

许多班级希望他们的init方法被调用,并且如果您不拨打init可能会导致崩溃。如果您正在讨论直接从NSObject继承的自定义类,并且不需要初始化实例变量,那么您可能会脱离[myClass alloc],但它肯定不是很好的编程风格。

+0

非常感谢您的解释。 “如果你正在谈论的是直接从NSObject继承的自定义类,并且不需要初始化实例变量,那么你可能会抛弃[myClass alloc],但它绝对不是好的编程风格。”那是我的情况。接受答案。 – toupper 2010-11-03 11:18:06

+2

@toupper:值得一提的是,如果你想有一个更短的语法,你可以做'[myClass的新];'这相当于'[[MyClass的页头] INIT]',但它很难被认为是时尚。 – 2010-11-03 11:21:43

2

我认为这不是一个好主意。
阅读可可设计模式,特别是“两个阶段创造”

您还可以阅读这篇文章http://www.informit.com/articles/article.aspx?p=1398610

+0

非常感谢,有用的信息。 – toupper 2010-11-03 11:19:56

+0

我不完全明白了吧“可可设计模式 - 两级创造”造:它声称两级创造更好,因为它避免了“构造函数/类方法/工厂方法”爆炸,但相比去渣,不[[Foo alloc] init]与Foo相同f = new Foo(); f.init();? – 2015-09-09 23:58:56

0

我认为,这将没有多大关系,如果你没有实现“ - (ID) init“,因为如果你这样做了,你会调用NSObject的init方法,它只是返回你发送给方法的相同值。尽管创建自己的init方法来设置实例变量是一个好主意。

相关问题