理解Objective-C ++ __block修饰符

时间:2011-08-18 09:30:27

标签: objective-c++ objective-c-blocks

我需要对Objective-C应用程序进行一些维护(更新它以使用新的API),并且之前从未使用过该语言,我有点困惑。

我有一个Objective-C ++类,它实现了我的API接口,这是在一个块中使用,但是无论何时在块中访问它,它都会因访问冲突错误(EXC_BAD_ACCESS)而失败。

Furthrer调查表明,没有任何相关对象的构造函数被调用。它在包含范围内声明,并使用__block修饰符。

为了尝试理解这一点,我做了一个快速的临时应用程序,发现同样的事情发生在那里:

class Foo
{
public:
    Foo() : value(1) { printf("constructor"); }
    void addOne() { ++value; printf("value is %d", value); }
private:
    int value;
};

void Bar()
{
    Foo foo1; // prints "constructor"
    __block Foo foo2; // doesn't print anything

    foo1.addOne(); //prints "2"
    foo2.addOne(); //prints "1"
}

有人能解释这里发生了什么吗?为什么不调用我的默认构造函数,如果没有正确构造对象,如何访问该对象?

2 个答案:

答案 0 :(得分:1)

据我了解,你的例子没有使用块,但是声明foo2被块使用。

这对处理foo2很有趣,你可以阅读更多关于here的内容。

希望有所帮助。

答案 1 :(得分:0)

偶然发现了这个老问题。这是一个长期以来修复的错误。现在__block正确构造了C ++对象。如果在块中引用并且复制了块,则堆复制是从原始构造移动构造的,如果无法移动构造,则构造为复制构造。