在使用之前,如何确保对象已完成初始化?

时间:2010-07-13 16:23:45

标签: objective-c oop initialization

在一个方法中编写一些Objective-C,我调用+alloc,然后调用-init来设置一个对象。

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

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

我有时会看到程序员按照

的方式写一些东西
if(object = [[MyClass alloc] init]) {
    [object useFor:whatever];
}

这是我应该去做的吗?

3 个答案:

答案 0 :(得分:9)

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

第二种形式是测试。首先,if语句调用init方法。如果返回有效对象,则测试为true,然后执行下一个语句。这就是为什么你看到init方法在成功时返回self而在遇到问题时返回nil的原因;这样可以运行这样的测试,以确保在继续之前已成功初始化对象。

答案 1 :(得分:4)

命令按顺序执行而不是并行执行

(伙计,学习一些基础知识;)

答案 2 :(得分:3)

通常,C和Objective-C函数(和方法)中的语句按照您编写它们的顺序依次执行。如果你在一个函数中在另一个之前写了一个东西,那么第一个必须在下一个函数执行之前完成执行。

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

所有这些都是很长的说法:在调用方法可以恢复执行之前,您的init方法将完成。