Вызов блока iOS

Я пытаюсь вызвать какой-то блок, но получаю ошибку EXC_BAD_ACCESS.

-(void) methodA {
   self.block = ^ {
       [self methodB];
   };
}

-(void) webViewDidFinishLoad:(UIWebView *)webView {
       [block invoke]; // error here (block is not valid id type).
}

-(void)methodB {
    //do something
}

Любые мысли о том, почему это происходит?


person Matrosov Alexander    schedule 28.02.2012    source источник
comment
Как свойство block определено в классе?   -  person Art Gillespie    schedule 28.02.2012


Ответы (4)


Вы должны использовать атрибут копирования при объявлении свойства блока. Нравится:

@property (nonatomic, copy)   id block;
person murat    schedule 28.02.2012

если вы хотите вызвать блок, вы можете просто сделать это block(); вместо [block invoke];

дополнительные сведения см. в Блокировать темы по программированию

person Julien    schedule 28.02.2012
comment
Я пытаюсь вызвать block(); и получить ошибку Вызванный объект '*(struct objc_object **)((char *)self + OBJC_IVAR_$_SettingsHelp.block)' не является функцией - person Matrosov Alexander; 28.02.2012
comment
это потому, что вы объявляете его как идентификатор. Взгляните на этот вопрос, чтобы увидеть, как вы можете объявить это правильно. - person murat; 28.02.2012
comment
Как сделать то же самое с быстрым? я имею в виду, если у меня есть закрытие, и я хочу просто вызвать func doneAction() { self.onActionSheetDone() } - person Zaporozhchenko Oleksandr; 09.02.2017

Вы должны поместить блок в кучу:

self.block = Block_copy(^{
    [self someMethod];
});

EDIT: ответ @murat тоже правильный (и, вероятно, лучше). Так или иначе, вам придется копировать блок, так как блоки фактически создаются в стеке, а не в куче.

Дополнительные сведения о блоках, которые вы хотите сохранить, см. в разделе "Копирование блоков" и "Шаблоны, которых следует избегать" в документации.

person Art Gillespie    schedule 28.02.2012

вы можете объявить свойство для блока в файле .h, как это, и это не даст плохих излишеств -

    typedef int (^devideEquallyBlock)(int);
    @property (nonatomic, copy) devideEquallyBlock callbackBlock;

Удостоверьтесь, что вы объявляете копию, не сохраняя более подробную информацию о том, как объявлять свойства блокирует программирование в ios/objective-c

person Community    schedule 26.03.2012