我需要对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"
}
有人能解释这里发生了什么吗?为什么不调用我的默认构造函数,如果没有正确构造对象,如何访问该对象?
答案 0 :(得分:1)
答案 1 :(得分:0)
偶然发现了这个老问题。这是一个长期以来修复的错误。现在__block
正确构造了C ++对象。如果在块中引用并且复制了块,则堆复制是从原始构造移动构造的,如果无法移动构造,则构造为复制构造。