2012-02-28 6 views
4

Я пытаюсь вызвать какой-то блок, но я запускаю EXC_BAD_ACCESS.Invoke block iOS

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

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

-(void)methodB { 
    //do something 
} 

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

+0

Как свойство 'block' определено в классе? –

ответ

9

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

@property (nonatomic, copy) id block; 
13

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

для получения более подробной информации см Block Programming Topics

+0

Я пытаюсь вызвать block(); и get error Вызываемый объект '* (struct objc_object **) ((char *) self + OBJC_IVAR _ $ _ SettingsHelp.block)' не является функцией –

+0

, потому что вы объявляете ее как id. Взгляните на [этот вопрос] (http://stackoverflow.com/questions/3935574/can-i-use-objective-c-blocks-as-properties), чтобы узнать, как вы можете его правильно объявить. – murat

+0

Это правильный ответ. – kelin

1

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

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

РЕДАКТИРОВАТЬ: @ Ответ мурата тоже правильный (и, вероятно, лучше). Так или иначе, вам нужно скопировать блок, поскольку блоки фактически созданы в стеке, а не в куче.

Подробнее о блоках, которые вы хотите сохранить, см. В документации "Copying Blocks" and "Patterns to Avoid".

0

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

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

Убедитесь, что вы объявляете копия не сохранить для более подробно описано, как объявить свойства blocks programming in ios/objective-c

 Смежные вопросы

  • Нет связанных вопросов^_^