Objective C - 对超类的弱引用?

时间:2013-12-13 18:19:40

标签: objective-c super

我试图在块内的超类上调用一个方法。 为了避免保留周期,我需要对super的弱引用。 我如何获得对超级的弱引用?

[self somethingWithCompletion:^(){
   [super doStuff];
}];

我尝试了以下操作,但出现了编译错误。

__weak MySuperClass *superReference = super;

2 个答案:

答案 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));
    }
});

缺点(在我看来):

  • 更多(复杂)代码。
  • 根据“Objective-C运行时编程指南”,您永远不应该打电话 消息传递直接在您的代码中运行。
  • 根据方法的返回类型,您必须使用objc_msgSendSuperobjc_msgSendSuper_stret
  • 对于接受参数的方法,您必须将objc_msgSendSuper强制转换为正确的 功能类型(感谢@newacct)。

答案 1 :(得分:3)

使用Objective-C运行时函数objc_msgSendSuper向弱self发送“超级消息”可以解决您的问题。

不可能“获得对超级的弱引用”,因为super是一种语言结构而不是一个单独的对象。请查看this explanation of super:What exactly is super in Objective-C?