You could define a helper method
-(void) helperMethod
{
[super doStuff];
// ...
[super doOtherStuff];
// ...
}
and then do
__weak MyClass *weakSelf = self;
[self somethingWithCompletion:^(){
MyClass *strongSelf = weakSelf;
[strongSelf helperMethod];
}];
A direct solution using the runtime methods looks like this:
__weak MyClass *weakSelf = self;
[self somethingWithCompletion:^(){
MyClass *strongSelf = weakSelf;
if (strongSelf) {
struct objc_super super_data = { strongSelf, [MyClass superclass] };
objc_msgSendSuper(&super_data, @selector(doStuff));
}
});
Disadvantages (in my opinion):
- More (complicated) code.
- According to the "Objective-C Runtime Programming Guide", you should never call
the messaging functions directly in your code.
- Depending on the return type of the method, you would have to use
objc_msgSendSuper
or objc_msgSendSuper_stret
.
- For methods taking arguments, you have to cast
objc_msgSendSuper
to the proper
function type (thanks to @newacct).