Skip to content

Instantly share code, notes, and snippets.

Forked from rabovik/RSWeakifySelf.h
Created April 30, 2014 05:34
What would you like to do?
* Several macros simplifying use of weak references to self inside blocks
* which goal is to reduce risk of retain cycles.
* Example:
* @code
@interface Example : NSObject{
int _i;
@property (nonatomic,copy) void(^block)(void);
@implementation Example
self.block = weakifySelf(^{
// Self may be nil here
[self doSomeWork];
// Self is strong and not nil.
// We can do ivars dereferencing
// and other stuff safely
self->_i = 42;
* @endcode
* Takes a block of any signature as an argument
* and makes all references to self in it weak.
#define weakifySelf(BLOCK...) \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wshadow\"") \
rs_blockWithWeakifiedSelf(self, ^id(__typeof(self) __weak self) { \
return (BLOCK); \
}) \
_Pragma("clang diagnostic pop")
* Creates a strong reference to a variable
* that will shadow the original
#define strongify(VAR) \
id _strong_##VAR = VAR; \
__typeof(VAR) __strong VAR = _strong_##VAR;
* Creates a strong reference to a variable and returns if it is nil
#define strongifyAndReturnIfNil(VAR) \
strongify(VAR) \
if (!(VAR)){ return;}
id rs_blockWithWeakifiedSelf(id self, id(^intermediateBlock)(id __weak self));
#import "RSWeakifySelf.h"
id rs_blockWithWeakifiedSelf(id self, id(^intermediateBlock)(id __weak self)){
id __weak weakSelf = self;
return intermediateBlock(weakSelf);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment