在iPhone中处理弃用的方法
如何处理iPhone中需要使用较新版本的旧方法的旧方法?
考虑setStatusBarHidden:animated:
的情况,在iOS 3.2中已弃用。 该文档指出您使用setStatusBarHidden:withAnimation:
,它仅在iOS 3.2或更高版本中可用。
如果我理解正确,这意味着要定位所有设备(iOS 3.0或更高版本),我必须首先询问setStatusBarHidden:withAnimation:
是否可用。 如果是,请使用它。 如果不是,请使用弃用的方法。 但我仍然会收到有关弃用的警告。
这是正确的(请说它不是!)? 如果是,是否有任何方法可以抑制此弃用警告,或者指示编译器已经处理了该问题?
我发现了一个类似的问题,假设是的 ,这是处理弃用方法的正确方法, 不 ,没有办法在每个案例的基础上抑制弃用警告,但有些黑客可能会误导编译器。
为了处理示例案例,我决定使用以下方法之一创建一个util类:
@protocol UIApplicationDeprecated - (void) setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated; @end @implementation UIUtils + (void) setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated { if([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarHidden:withAnimation:)]) { [[UIApplication sharedApplication] setStatusBarHidden:hidden withAnimation:animated ? UIStatusBarAnimationSlide : UIStatusBarAnimationNone]; } else { id app = (id)[UIApplication sharedApplication]; [app setStatusBarHidden:hidden animated:animated]; } } @end
如果我没有错误地使用respondsToSelector
是昂贵的。 这可以针对性能进行优化,以便在第一次查询之后存在新选择器,从而避免在后续调用中需要reflection。
来自Java背景,我发现这种处理弃用令人震惊的方式,我仍然无法相信这是iOS设计师期望我们处理这个问题的方式。 对此主题的更多想法将不胜感激。
可能有一个更好的答案,但我曾经做过的是:
1检查deprecatedMethod
是否可用。 (使用respondsToSelector:
方法)
2如果是,则使用objective-c运行时函数调用该方法:
id objc_msgSend(id theReceiver, SEL theSelector, ...)
使用此函数时,编译器不会给你任何警告:)
3另外明智地使用新方法
以这种方式调用方法:
id objc_msgSend(id theReceiver, SEL theSelector, ...)
如果您想省略UIApplication可能无法响应setStatusBarHidden:withAnimation:
method(在iOS 3.0或更高版本中)的警告,将会更好地选择。