FIX leak by not releasing correctly block. You can check by use any strong referenced var inside block and it is never released: ... AnyClass * obj = [AnyClass new] [alertView respondsToSelector:@selector(alertView:didDismissWithButtonIndex:) withKey:nil usingBlock:^(id receiver, UIAlertView *alertView, NSInteger buttonIndex) { ////... NSLog (@"%@", obj); }]; imp_implementationWithBlock retains block so expression 'imp_removeBlock(imp_implementationWithBlock(block)) does not release block. Similar you create extra reference for every superblock when you call supermethodOfCurrentBlock It is better keep created from block implementation pointer  in blockInfo dictionary instead of block itself. And use it later when releasing or returning superblock implementation.
FIX leak by not releasing correctly block. You can check by use any strong referenced var inside block and it is never released:
...
AnyClass * obj = [AnyClass new]
[alertView respondsToSelector:@selector(alertView:didDismissWithButtonIndex:) withKey:nil usingBlock:^(id receiver, UIAlertView *alertView, NSInteger buttonIndex) {
////...
NSLog (@"%@", obj);
}];
imp_implementationWithBlock retains block so expression 'imp_removeBlock(imp_implementationWithBlock(block)) does not release block. Similar you create extra reference for every superblock when you call supermethodOfCurrentBlock
It is better keep created from block implementation pointer  in blockInfo dictionary instead of block itself. And use it later when releasing or returning superblock implementation.

After you apply new implementation obj variable from code above release after alertView disappears and released.

bounin/REKit