2010-07-13 55 views
3

用一种方法编写一些Objective-C,我调用+alloc,然后-init来设置一个对象。如何在使用前确保对象已完成初始化?

object = [[MyClass alloc] init]; 
[object useFor:whatever]; 

接下来几行代码使用新创建的对象。如果前面提到的-init花费的时间太长,我肯定程序在开始使用新对象之前不会“等待”,是不是?如果没有,是否有快速确保-init完成的方法?

我有时会看到谁写沿

if(object = [[MyClass alloc] init]) { 
    [object useFor:whatever]; 
} 

线的东西程序员这是我应该去什么?

回答

3

作为一项规则,在C和Objective-C函数(和方法)语句顺序执行,在你写的顺序。如果你在一个函数中先写另一个函数,那么第一个必须在下一个执行之前完成执行。

编译器可能重新排序语句,如果它认为,这样做不会改变程序(它可以在不涉及并发的情况下预测得很好)的行为,但是这是一种优化。 C标准将语句视为顺序语句,但只要实际程序的行为与语句按其写入顺序执行时相同,编译器就可以以任何方式实现它们。

这一切是说的很长的路要走:您init方法完成之前,调用方法可以继续执行。

+0

谢谢,这非常有帮助。我认为方法调用(或消息发送)的行为不同,但现在我意识到情况并非如此。 – 2010-07-14 00:04:14

4

命令将按顺序执行的,而不是paralell

(纨绔子弟,学习一些基础知识;)

+1

嘿,谢谢。尽管公平,但在ObjC中的基础文献通常会“没有代码的话就把它看成是一个文本编辑器”,并且这个理论失败了。 – 2010-07-14 00:02:19

9

当你调用init程序将不会继续到下一行,直到init方法返回。到达第二行时,init方法已完成。它可能没有成功完成,但它已经完成。

第二种形式是测试。首先,if声明称为init方法。如果返回有效的对象,则测试为真,然后执行下一条语句。这就是为什么你会看到init方法在成功时返回self,当有问题时会返回nil;以便可以运行这些测试以确保该对象在继续之前已成功初始化。