Piotr Czapla
Piotr Czapla

Reputation: 26532

How to store blocks in properties in Objective-C?

I'd like to store objective-c block in a property for later use. I wasn't sure how to do it so I googled a bit and there is very little info about the subject. But I've managed to find the solution eventually and I've thought that it might be worth sharing for other newbies like me.

Initially I've thought that I would need to write the properties by hand to use Block_copy & Block_release.

Fortunately I've found out that blocks are NSObjects and - copy/- release is equivalent to Block_copy/Block_release. So I can use @property (copy) to auto generate setters & getters.

Upvotes: 80

Views: 41700

Answers (3)

Dave DeLong
Dave DeLong

Reputation: 243156

Edit: updated for ARC

typedef void(^MyCustomBlock)(void);

@interface MyClass : NSObject

@property (nonatomic, copy) MyCustomBlock customBlock;

@end

@implementation MyClass

@end

MyClass * c = [[MyClass alloc] init];
c.customBlock = ^{
  NSLog(@"hello.....");
}

c.customBlock();

Upvotes: 137

Jorge Perez
Jorge Perez

Reputation: 1606

You can find a very good explanation of this in WWDC 2012 session 712 starting in page 83. The correct way of saving a block under ARC is the following:

@property(strong) my_block_type work;

Be careful with the retain cycles. A good way to solve is set the block to nil when you do not need it anymore:

self.work = nil;

Upvotes: 9

Steven Kramer
Steven Kramer

Reputation: 8513

Alternatively, without the typedef

@property (copy, nonatomic) void (^selectionHandler) (NSDictionary*) ;

Upvotes: 104

Related Questions