将__attribute __((objc_requires_super))与协议一起使用

时间:2017-03-02 11:09:33

标签: ios objective-c

我有这样的事情:

@protocol MyProtocol <NSObject>

- (void)oneMethod;

@end

@interface BaseClassWithProtocol : NSObject <MyProtocol>

@end

@interface ChildClassWithProtocol : BaseClassWithProtocol

@end

BaseClassWithProtocol已实施oneMethod,如果ChildClassWithProtocol在其oneMethod实施中未调用超级,我想显示警告。

但我不知道我应该在哪里写__attribute__((objc_requires_super))

在.h中重新定义oneMethod看起来很愚蠢时,不支持在协议中编写它。

那么有没有可以解决问题的标准方法呢?

2 个答案:

答案 0 :(得分:7)

BaseClassWithProtocol强制要求拨打超级电话。它不是协议的一部分。当然,有些班级可以实施MyProtocol,但是没有强制要求。这是协议的本质。它们强加接口,而不是实现。

因此,使用该属性重新声明BaseClassWithProtocol中的方法对我来说似乎是非常明智的。不知道为什么它看起来很愚蠢&#34;。

答案 1 :(得分:1)

协议并不意味着为您的各种实施提供警告。他们只是警告您是否同意在实施中包含所需的方法。但是,如何实施这些方法,以及采用该协议的 Base 类。也就是说,您应该在.h或.m文件中拥有必要的功能。

考虑这种方式:

  

您的协议中有一个方法,您希望对超级呼叫发出警告。现在你在一个类中采用协议,这是NSObject的子类。但是NSObject类并不符合您定义的协议。你现在应该为你的班级收到警告吗? 根据您的要求,您应该收到警告。但事实并非如此。你几乎不会通过这个程序得到警告。