【问题标题】:Objective C - Weak reference to super class?Objective C - 对超类的弱引用?
【发布时间】:2013-12-13 18:19:40
【问题描述】:

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

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

我尝试了以下但给出了编译错误。

__weak MySuperClass *superReference = super;

【问题讨论】:

  • “超级”是虚构的。
  • [super doStuff] 与 [self doStuff] 不同吗?
  • @farski 嗯……嗯……吃苹果和吃橙子有区别吗?
  • @farski 是的,它们是不同的。 self 会遍历当前类中的方法,然后调用 super(如果指定),调用 super 会直接调用 super 类,而无需遍历我的继承类中的逻辑

标签: objective-c super


【解决方案1】:

你可以定义一个辅助方法

-(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)。

【讨论】:

  • 我知道我可以做一个助手,但是我调用的 super 中有几个方法,我不想为所有这些方法做助手。我喜欢第二种解决方案
  • @aryaxt:您可以将所有超级调用移至辅助方法,因此您只需调用一个辅助方法。我已经更新了答案以使其更清楚。
  • @MartinR 我不明白他为什么需要这个。他可以在街区内做[super doStuff];
  • @H2CO3 这不会导致一个保留周期,因为当前类正在保留我的块,而该块将保留强引用?
  • @H2CO3: [super doStuff]; 会将消息发送到self(当然,在超类中开始方法解析)。 - 它没有在我的测试方法中编译。
【解决方案2】:

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

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

【讨论】:

  • 这应该是一条评论。
  • @H2CO3,我澄清了哪一部分回答了问题,哪一部分有助于完成工作。现在好点了吗?
  • 这并没有改变这个“答案”是一个只有链接的事实。
  • 我没有关注你。主要答案部分是使用 Objective-C 运行时函数 objc_msgSendSuper 向弱自我发送“超级消息”。它没有链接。
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2013-10-26
相关资源
最近更新 更多