在iPhone中处理不推荐使用的方法

问题描述:

如何处理iPhone中需要使用较新方法但不适用于较旧版本的不推荐方法?在iPhone中处理不推荐使用的方法

请考虑在iOS 3.2中弃用的setStatusBarHidden:animated:的情况。该文档指出您要使用setStatusBarHidden:withAnimation:,它仅在iOS 3.2或更高版本中可用。

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

这是正确的(请说不是!)?如果是这样,是否有办法抑制这个弃用警告,或者说明编译器我已经处理了这个问题?

我发现了一个similar疑问,假设,这是处理过时的方法的正确途径,没有,没有办法根据每个案例抑制弃用警告,但是有一些诡计会误导编译器。

为了应付例子的情况下,我决定创建使用这些黑客之一的UTIL类:如果我没有记错使用respondsToSelector是昂贵

@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 

。如果新的选择器在第一个查询之后出现,这可以针对性能进行优化,从而避免在随后的调用中需要反射。

从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:方法应对(在iOS 3.0或更高版本)更好的最佳的选择。