在iPhone中处理已弃用的方法

时间:2010-09-04 15:37:32

标签: iphone ios compiler-warnings deprecated

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

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

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

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

3 个答案:

答案 0 :(得分:6)

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

为了处理示例案例,我决定使用其中一个hacks创建一个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

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

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

答案 1 :(得分:1)

可能有更好的答案,但我曾经做过的是:

1检查deprecatedMethod是否可用。 (使用respondsToSelector:方法)

2如果是,则使用objective-c运行时函数调用该方法:

id objc_msgSend(id theReceiver, SEL theSelector, ...)

使用此函数时,编译器不会给你任何警告:)

另外3个方法使用新方法

答案 2 :(得分:0)

以这种方式调用方法:

id objc_msgSend(id theReceiver, SEL theSelector, ...)

如果您想省略UIApplication可能无法响应setStatusBarHidden:withAnimation:方法(在iOS 3.0或更高版本中)的警告,

将是更好的选择。