Invoke block iOS
Asked Answered
V

4

6

I try to invoke some block, but I run into a 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
}

Any thoughts on why this is happening?

Violante answered 28/2, 2012 at 14:50 Comment(1)
How is the block property defined on the class?Herbivorous
M
9

You should use copy attribute when you are declaring block property. Like:

@property (nonatomic, copy)   id block;
Marniemaro answered 28/2, 2012 at 15:22 Comment(0)
W
15

if you want to invoke the block you can simply do this block(); instead of [block invoke];

for more details, see the Block Programming Topics

Weidner answered 28/2, 2012 at 15:0 Comment(3)
I try to call block(); and get error Called object '*(struct objc_object **)((char *)self + OBJC_IVAR_$_SettingsHelp.block)' is not a functionViolante
that is because you are declaring it as id. Take a look at this question to see how you can declare it properly.Marniemaro
How to do same stuff with swift? i mean if i have a closure and i want just call func doneAction() { self.onActionSheetDone() }Envenom
M
9

You should use copy attribute when you are declaring block property. Like:

@property (nonatomic, copy)   id block;
Marniemaro answered 28/2, 2012 at 15:22 Comment(0)
H
1

You have to put the block on the heap:

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

EDIT: @murat's answer is correct, too (and probably better). One way or the other, you have to copy the block, since blocks are actually created on the stack and not on the heap.

For more on blocks you want to keep around, see "Copying Blocks" and "Patterns to Avoid" in the documentation.

Herbivorous answered 28/2, 2012 at 15:21 Comment(0)
H
0

you can declare a property for block in .h file like this and it will not give bad-excess -

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

Make sure that you declare copy not retain for more details how to declare properties blocks programming in ios/objective-c

Happygolucky answered 26/3, 2012 at 11:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.