【问题标题】:Dealing with deprecated methods in iPhone处理 iPhone 中不推荐使用的方法
【发布时间】:2010-09-04 15:37:31
【问题描述】:

您如何处理 iPhone 中已弃用的方法,这些方法需要您使用较新的方法,而旧版本中不可用?

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

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

这是正确的(请说它不是!)?如果是,有什么方法可以抑制这个弃用警告,或者表明我已经处理了这个问题的编译器?

【问题讨论】:

    标签: iphone ios compiler-warnings deprecated


    【解决方案1】:

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

    为了处理示例案例,我决定使用以下技巧之一创建一个 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 设计人员期望我们处理这个问题。对此主题的更多想法将不胜感激。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      3 其他明智的使用新方法

      【讨论】:

        【解决方案3】:

        以这种方式调用方法:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-05
          • 1970-01-01
          相关资源
          最近更新 更多