在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或更高版本中)的警告,将会更好地选择。

Interesting Posts