我正在尝试调用 block 内父类(super class)的方法。 为了避免保留循环,我需要对 super 的弱引用。 我如何获得对 super 的弱引用?
[self somethingWithCompletion:^(){
[super doStuff];
}];
我尝试了以下但给出了编译错误。
__weak MySuperClass *superReference = super;
最佳答案
你可以定义一个辅助方法
-(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));
}
});
缺点(我认为):
- 更多(复杂)代码。
- 根据“Objective-C Runtime Programming Guide”,你不应该调用 消息传递功能直接在您的代码中。
- 根据方法的返回类型,您必须使用
objc_msgSendSuper
或objc_msgSendSuper_stret
。 - 对于带参数的方法,您必须将
objc_msgSendSuper
转换为正确的 函数类型(感谢@newacct)。
关于objective-c - Objective-C - 对父类(super class)的弱引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20573316/