如何处理iPhone中需要使用较新版本的旧方法的旧方法?
考虑setStatusBarHidden:animated:
的情况,在iOS 3.2中已弃用。该文档指出您使用setStatusBarHidden:withAnimation:
,该版本仅适用于iOS 3.2或更高版本。
如果我理解正确,这意味着要定位所有设备(iOS 3.0或更高版本),我必须首先询问setStatusBarHidden:withAnimation:
是否可用。如果是,请使用它。如果不是,请使用弃用的方法。但我仍然会收到弃权警告。
这是否正确(请说不是!)?如果是,是否有任何方法可以抑制此弃用警告,或者指示编译器已经处理了该问题?
答案 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, ...)
setStatusBarHidden:withAnimation:
方法(在iOS 3.0或更高版本中)的警告,将是更好的选择。