【发布时间】:2013-04-18 22:25:15
【问题描述】:
当不使用 ARC 时,在你的 dealloc 方法中没有调用 [super dealloc] 时会收到警告。
我正在尝试用一个经常被子类化的类来实现类似的东西,以在实现子类的人不调用 super 时警告他们。
有什么想法吗?
【问题讨论】:
标签: objective-c xcode
当不使用 ARC 时,在你的 dealloc 方法中没有调用 [super dealloc] 时会收到警告。
我正在尝试用一个经常被子类化的类来实现类似的东西,以在实现子类的人不调用 super 时警告他们。
有什么想法吗?
【问题讨论】:
标签: objective-c xcode
最近的llvm版本增加了一个属性,表示子类必须调用super:
@interface Barn:NSObject
- (void)openDoor NS_REQUIRES_SUPER;
@end
@implementation Barn
- (void) openDoor
{
;
}
@end
@interface HorseBarn:Barn
@end
@implementation HorseBarn
- (void) openDoor
{
;
}
@end
编译上面会产生警告:
Method possibly missing a [super openDoor] call
【讨论】:
NS_REQUIRES_SUPER 是该属性的现代/清洁方法。
查看bbum's answer 以直接告诉编译器子类必须调用super。
Apple 所做的通常是提供一个钩子,例如viewDidLoad。 Apple 在-[UIViewController viewDidLoad] 基础上没有做任何工作。这是一个空方法。取而代之的是,Apple 在其他地方以您不允许覆盖的私有方法执行其工作,并从该方法调用您的viewDidLoad。因此,即使您忘记在您的 UIViewController 子类中调用 [super viewDidLoad],Apple 的所有工作仍然可以完成。
也许您可以修改您的 API 以使用类似的模式。
【讨论】:
loadView 用于 UIViewController)。
super 未被调用时,Apple 使用该模式来减少损害。 (我没有假设 Apple 是否使用该模式。我已经在多个版本的 iOS 上通过测试和反汇编验证了它。当然,他们可能会在未来的某个版本中停止使用它。)
viewDidLoad 的特定情况下,您不必为UIViewController 子类调用[super viewDidLoad]。无论如何我都会打电话给超级,因为这是一个好习惯。
NS_REQUIRES_SUPER
是现代的表达方式
__attribute__((objc_requires_super))
【讨论】: