在iPhone中处理已弃用的方法

hpi*_*que 5 iphone deprecated compiler-warnings ios

如何处理iPhone中需要使用较新版本的旧方法的旧方法?

考虑一下setStatusBarHidden:animated:在iOS 3.2中弃用的情况.您将使用的文档指向setStatusBarHidden:withAnimation:,仅适用于iOS 3.2或更高版本.

如果我理解正确,这意味着要定位所有设备(iOS 3.0或更高版本),我必须首先询问是否setStatusBarHidden:withAnimation:可用.如果是,请使用它.如果不是,请使用弃用的方法.但我仍然会收到弃权警告.

这是正确的(请说它不是!)?如果是,是否有任何方法可以抑制此弃用警告,或者指示编译器已经处理了该问题?

hpi*_*que 6

我发现了一个类似的问题,假设是的,这是处理弃用方法的正确方法,,没有办法在每个案例的基础上抑制弃用警告,但是有一些黑客可能会误导编译器.

为了处理示例案例,我决定使用以下方法之一创建一个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<UIApplicationDeprecated> app = (id)[UIApplication sharedApplication];
        [app setStatusBarHidden:hidden animated:animated];
    }
}

@end
Run Code Online (Sandbox Code Playgroud)

如果我没弄错,使用respondsToSelector费用很高.这可以针对性能进行优化,以便在第一次查询之后存在新选择器,从而避免在后续调用中需要反射.

来自Java背景,我发现这种处理弃用令人震惊的方式,我仍然无法相信这是iOS设计师期望我们处理这个问题的方式.关于这个问题的更多想法将不胜感激.