Понимание модификатора Objective-C ++ __block - PullRequest
0 голосов
/ 18 августа 2011

Мне нужно немного поработать с приложением Objective-C (обновить его для использования нового API), и, никогда раньше не использовав язык, я немного растерялся.

У меня есть цель-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"
}

Кто-нибудь может объяснить, что здесь происходит?Почему не вызывается мой конструктор по умолчанию, и как я могу получить доступ к объекту, если он не был правильно построен?

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Насколько я понимаю, ваш пример там не использует блок как таковой, но объявляет foo2 как используемый блоком.

Это делает забавные вещи с обработкой foo2, о которой вы можете прочитать больше о здесь .

Надеюсь, это поможет.

0 голосов
/ 29 мая 2014

Наткнулся на этот старый вопрос. Это была ошибка, которая давно исправлена. Теперь __block C ++ объекты правильно сконструированы. Если на него ссылаются в блоке, и блок копируется, копия кучи строится на основе перемещения из оригинала или создается на основе копии, если она не может быть создана на основе перемещения.

...