Мне нужно выполнить некоторое обслуживание приложения Objective-C (обновить его для использования нового API), и, поскольку я никогда раньше не использовал этот язык, я немного запутался.
У меня есть класс Objective-C++, который реализует интерфейс из моего API, и он используется внутри блока, однако всякий раз, когда к нему обращаются внутри блока, происходит сбой с ошибкой нарушения прав доступа (EXC_BAD_ACCESS).
Дальнейшее исследование показывает, что ни один из конструкторов рассматриваемого объекта не вызывается. Он объявлен в пределах области действия и использует модификатор __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"
}
Кто-нибудь может объяснить, что здесь происходит? Почему мой конструктор по умолчанию не вызывается и как я могу получить доступ к объекту, если он не был правильно сконструирован?