objective-c - Objective-C - 对父类(super class)的弱引用?

标签 objective-c super

我正在尝试调用 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_msgSendSuperobjc_msgSendSuper_stret
  • 对于带参数的方法,您必须将 objc_msgSendSuper 转换为正确的 函数类型(感谢@newacct)。

关于objective-c - Objective-C - 对父类(super class)的弱引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20573316/

相关文章:

objective-c - 操作系统 X : Saving open application states

iphone - 我如何确定一个 NSDate(包括时间)是否已经过去

ios - 后台 session 不支持从 NSData 上传任务

java - 保留对传递给 super 构造函数的新对象的引用

python - 当父类有 super() 时,这意味着什么?

Python类递归

ios - 从 iOS10 中的 Today 小部件隐藏 "Show More"按钮

objective-c - 比写几十个空的 getter 更好的方法?

Python: 'super' 对象没有属性 'attribute_name'

java - 如何在通知中调用父类(super class)方法?