我试图在块内的超类上调用一个方法。 为了避免保留周期,我需要对super的弱引用。 我如何获得对超级的弱引用?
[self somethingWithCompletion:^(){
[super doStuff];
}];
我尝试了以下操作,但出现了编译错误。
__weak MySuperClass *superReference = super;
答案 0 :(得分:17)
您可以定义辅助方法
-(void) helperMethod
{
[super doStuff];
// ...
[super doOtherStuff];
// ...
}
然后再做
__weak MyClass *weakSelf = self;
[self somethingWithCompletion:^(){
MyClass *strongSelf = weakSelf;
[strongSelf helperMethod];
}];
使用运行时方法的直接解决方案如下所示:
__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));
}
});
缺点(在我看来):
objc_msgSendSuper
或objc_msgSendSuper_stret
。objc_msgSendSuper
强制转换为正确的
功能类型(感谢@newacct)。答案 1 :(得分:3)
使用Objective-C运行时函数objc_msgSendSuper
向弱self
发送“超级消息”可以解决您的问题。
不可能“获得对超级的弱引用”,因为super
是一种语言结构而不是一个单独的对象。请查看this explanation of super
:What exactly is super in Objective-C? 。