2014-09-08 2 views
11

Множество классов UIKit можно подклассифицировать, но в документации спрашивается, что определенные методы, если они переопределены, должны быть обязательно вызывать до super. Например:Почему методы UIKit не используют NS_REQUIRES_SUPER?

-[UIViewController viewWillAppear:] 
-[UITableViewCell didTransitionToState:] 
<every method UIPercentDrivenInteractiveTransition declares> 

Почему компания Apple решила не добавлять NS_REQUIRES_SUPER заявлениям этих методов, так как они действительно «требуют супер»? Моя первая мысль была обратная совместимостью с более ранними версиями звона, но и это не проблема, я думаю, после прочтения следующого лязга документации отрывка:

Обратите внимание, что на обоих OS X и прошивке, что основа Foundation обеспечивает удобство макро NS_REQUIRES_SUPER, который обеспечивает синтаксический сахар для этого атрибута:

- (void)foo NS_REQUIRES_SUPER;

Этот макрос условно определяется в зависимости от поддержки компилятора для этого атрибута. Если компилятор не поддерживает атрибут, макрос расширяется до нуля.

+5

На этот вопрос могут ответить только люди, ответственные за эти API. Ошибочно думать об Apple как о единственной ответственной стороне. Отдельные разработчики написали эти API, и некоторые из них могут не знать о NS_REQUIRES_SUPER или просто забыть об этом. В любом случае, в первых двух вы упомянули предшествующее 'NS_REQUIRES_SUPER', поэтому, возможно, они просто не дошли до аннотации этих двух, или они не комментируют их, чтобы не нарушать исходный код, который работает, несмотря на то, что он не вызывает супер. –

+0

Что Роб сказал, возможно, решение будет https://gist.github.com/steipete/5626678 –

+0

Я считаю, что вместо того, чтобы заставить разработчика называть 'super', они решили переписать API. В идеале, при переопределении метода, который должен быть переопределен, вам не нужно называть 'super'. Обратите внимание, что все методы 'UIViewController.viewWill/Did ...' в настоящее время говорят, что« default ничего не делает »или« default is nop ». Это лучшее решение, чем просто маркировка метода флагом компилятора. Однако также обратите внимание, что при переопределении метода вы должны (почти) всегда называть 'super'; это означает, что они должны были бы добавить флаг в основном к каждому методу API. – Sulthan

ответ

0

Потому что это относительно новая аннотация, и люди не сделали работу, чтобы применить ее к (огромному) api.