【问题标题】:Would it be correct/ellegant use only alloc without init?仅使用 alloc 而不使用 init 是否正确/优雅?
【发布时间】:2011-05-04 09:54:05
【问题描述】:

如果我们不想在我们的类中实现 init 方法,并且记住 NSObject 中的 init 只返回一个没有初始化的对象的实例,如果我们已经得到了,我看不出调用 init 的意义使用 alloc 的实例。我试过了,它可以工作,但我不确定它是否会导致未来的问题。

myClass *newObject = [myClass alloc];

代替:

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

非常感谢。

【问题讨论】:

    标签: iphone objective-c cocoa-touch memory-management init


    【解决方案1】:

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

    许多类都希望它们的init 方法被调用,如果你不调用init,可能会导致崩溃。如果您谈论的是直接继承自 NSObject 并且不需要初始化实例变量的自定义类,您可能会选择 [myClass alloc],但这绝对不是一种好的编程风格。

    【讨论】:

    • 非常感谢您的解释。 “如果您正在谈论直接从 NSObject 继承且不需要初始化实例变量的自定义类,您可能会使用 [myClass alloc],但它绝对不是好的编程风格。”那是我的情况。已接受答案。
    • @toupper:值得一提的是,如果你想要更短的语法,你可以使用[myClass new];,它相当于[[myClass alloc] init];,但它很难被认为是流行的。
    【解决方案2】:

    我认为这不是一个好主意。
    阅读 Cocoa 设计模式,尤其是“两阶段创作”

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

    【讨论】:

    • 我没有完全理解“Cocoa 设计模式 - 两阶段创建”的观点:它声称两阶段创建更好,因为它避免了“构造函数/类方法/工厂方法”的爆炸,但是与 java 相比,[[Foo alloc] init] 与 Foo f = new Foo(); 不同吗? f.init();?
    【解决方案3】:

    我认为如果你没有实现一个“- (id)init”,这并不重要,因为如果你这样做了,你会调用 NSObject 的 init 方法,它只会返回你发送给该方法的相同值。虽然创建自己的 init 方法来设置实例变量是个好主意。

    【讨论】:

      【解决方案4】:

      在运行时源代码中 执行-(id)init 将调用_objc_rootInit(self) 并将返回self。我猜只执行init就可以了。

      【讨论】:

        猜你喜欢
        • 2010-10-17
        • 2014-02-20
        • 1970-01-01
        • 1970-01-01
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 2014-10-08
        • 1970-01-01
        相关资源
        最近更新 更多