I was wondering if it's possible to store a reference to an anonymous function (block) as an instance variable in Objective-C.
I know how to use delegation, target-action, etc. I am not talking about this.
The __block Storage Type __block variables live in storage that is shared between the lexical scope of the variable and all blocks and block copies declared or created within the variable's lexical scope.
An instance variable is a variable that exists and holds its value for the life of the object. The memory used for instance variables is allocated when the object is first created (through alloc ), and freed when the object is deallocated.
Normally, variables and their contents that are also used in blocks are copied, thus any modification done to these variables don't show outside the block. When they are marked with __block , the modifications done inside the block are also visible outside of it.
Sure.
typedef void(^MyCustomBlockType)(void);
@interface MyCustomObject {
MyCustomBlockType block;
}
@property (nonatomic, copy) MyCustomBlockType block; //note: this has to be copy, not retain
- (void) executeBlock;
@end
@implementation MyCustomObject
@synthesize block;
- (void) executeBlock {
if (block != nil) {
block();
}
}
- (void) dealloc {
[block release];
[super dealloc];
}
@end
//elsewhere:
MyCustomObject * object = [[MyCustomObject alloc] init];
[object setBlock:^{
NSLog(@"hello, world!");
}];
[object executeBlock];
[object release];
Yes, you most certainly can store a reference to a (copy) of an Objective-C block. The variable declaration is a little bit hairy, like C function pointers, but beyond that it's no problem. For a block that takes and id
and returns void:
typedef void (^MyActionBlockType)(id);
@interface MyClass : NSObject
{
}
@property (readwrite,nonatomic,copy) MyActionBlockType myActionBlock;
@end
will do the trick.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With