Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么不';UIKit方法利用NS\U要求\U SUPER?_Ios_Objective C_Clang - Fatal编程技术网

Ios 为什么不';UIKit方法利用NS\U要求\U SUPER?

Ios 为什么不';UIKit方法利用NS\U要求\U SUPER?,ios,objective-c,clang,Ios,Objective C,Clang,大量的UIKit类可以子类化,但是文档要求某些方法如果被重写,必须确保仍然调用super。例如: -[UIViewController viewWillAppear:] -[UITableViewCell didTransitionToState:] <every method UIPercentDrivenInteractiveTransition declares> -[UIViewController视图将出现:] -[UITableViewCell DidTransitio

大量的
UIKit
类可以子类化,但是文档要求某些方法如果被重写,必须确保仍然调用
super
。例如:

-[UIViewController viewWillAppear:]
-[UITableViewCell didTransitionToState:]
<every method UIPercentDrivenInteractiveTransition declares>
-[UIViewController视图将出现:]
-[UITableViewCell DidTransitionState:]
为什么苹果选择不在这些方法的声明中附加内容,因为它们确实“需要超级用户”?我的第一个想法是与早期版本的clang向后兼容,但在阅读了以下clang文档节选后,我认为这并不是一个问题:

注意,在OS X和iOS上,基础框架提供了 便利宏

NS\u需要\u SUPER
,它为此提供语法糖 属性:

-(void)foo NS\u需要超级

此宏是有条件定义的,具体取决于编译器对 这个属性。如果编译器不支持该属性,则宏 扩展为零


因为这是一个相对较新的注释,人们还没有将其应用到(巨大的)api中。

这个问题只能由负责这些api的人员来真正回答。将苹果视为一个单一的责任方是错误的。个别开发人员编写了这些API,其中一些人可能不知道
NS\u REQUIRES\u SUPER
,或者干脆忘记了它。不管怎么说,你提到的前两个在
NS\u之前就需要\u SUPER
,所以也许他们只是还没有来得及注释这两个,或者他们没有注释它们,以避免在不调用SUPER的情况下破坏正常工作的源代码。Rob说,不过,一个可能的解决方案是,我相信他们不会强迫开发人员调用
super
,而是决定重写API。理想情况下,当重写一个被重写的方法时,您不必调用
super
。请注意,所有的
UIViewController.viewWill/Did…
方法当前都说“默认不做任何事情”或“默认为nop”。这是一个比仅仅用编译器标志标记方法更好的解决方案。但是,还要注意,当重写方法时,应该(几乎)始终调用
super
;这意味着他们必须将标志基本上添加到API中的每个方法中。