【问题标题】:How do I flag a method as deprecated in Objective-C 2.0?如何在 Objective-C 2.0 中将方法标记为已弃用?
【发布时间】:2011-04-23 22:47:34
【问题描述】:

我是一个开发相当大的 iPad 应用程序的团队的一员,因此我们创建了许多不同的类。问题是一些方法现在已经过时了,我不想简单地删除它们,因为我知道整个系统的某些部分使用这些方法......但是应该使用更好(更新)的变体取而代之的是(一些旧的实际上调用了新的,但整个类接口变得混乱)。

有没有办法可以将某些方法标记为已弃用(如 Java 中的 @deprecated 和 .NET 中的 [Obsolete])。

我看到 Apple 使用了 Availability.h 并且有诸如

之类的标签
__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

...这是唯一的方法吗(+ App Store 这样做安全吗?)还是有其他方法可以在 Xcode 中标记警告?

【问题讨论】:

    标签: iphone objective-c deprecated


    【解决方案1】:

    弃用语法

    提供语法以将方法标记为已弃用:

    @interface SomeClass
    -method __attribute__((deprecated));
    @end
    

    或:

    #include <AvailabilityMacros.h>
    @interface SomeClass
    -method DEPRECATED_ATTRIBUTE;  // or some other deployment-target-specific macro
    @end
    

    【讨论】:

    • 这个宏对我来说很有意义,它保留了__attribute__ 语法的感觉。 #define __deprecated__ __attribute__((deprecated))
    • 有趣的是,Xcode 并没有对我使用标记为已弃用的方法发出任何警告。是否需要设置编译器标志?
    • 在 Xcode 的代码完成下拉菜单中,我看到该方法被标记为已弃用,但使用它不会给出编译器警告。
    • @Answerbot Build settings > 警告不推荐使用的功能...将其设置为 YES
    • 如何添加应该使用的Alternative方法?
    【解决方案2】:

    使用deprecated 属性:

    - (int)bar: (int)x __attribute__((deprecated));
    

    【讨论】:

      【解决方案3】:

      恕我直言,写 __deprecated 更容易:

      - (void)myDeprecatedMethod __deprecated;
      - (int)methodNameDeprecated:(int)param __deprecated;
      

      也适用于课程

      __deprecated
      @interface MyDeprecatedClass
      
        // ... some properties and methods ...
      
      @end
      

      【讨论】:

      • 更好的方法。
      • 没有提供描述,所以你不知道是否应该使用不同的方法或什么...
      • #define __deprecated __attribute__((deprecated))
      • 为什么比DEPRECATED_ATTRIBUTE好?只是因为它更短还是有任何实际差异?
      【解决方案4】:

      如果你想用弃用标志提供额外的信息,你可以使用以下标志。

      @property (strong, nonatomic) NSString *catName
                          __deprecated_msg("use name instead.");
      
      //  -- Or -- 
      @property (strong, nonatomic) NSString *catName
                          DEPRECATED_MSG_ATTRIBUTE("use name instead.");
      
      //  -- Or -- 
      @property (strong, nonatomic) NSString *catName
                          __attribute__((deprecated("use name instead.")));
      

      使用上面提到的标志,您可以知道为什么要弃用或开发人员将来应该使用什么方法。

      【讨论】:

      • 我更喜欢收到带有弃用警告的消息。它对 API 的新用户更有帮助。所以,我认为这是最好的答案。
      • 我最喜欢这个答案,因为它是我需要的最清晰、最容易使用的复制粘贴。您能否还通过弃用方法的示例来增强它?整个班级?是完全一样的吗?
      【解决方案5】:

      要将方法标记为已弃用,请使用 __attribute__((deprecated("Your message goes here")))

      一个实际的例子,来自 Mantle

      @interface NSValueTransformer (UnavailableMTLPredefinedTransformerAdditions)
      
      + (NSValueTransformer *)mtl_externalRepresentationTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONDictionaryTransformerWithModelClass:")));
      + (NSValueTransformer *)mtl_externalRepresentationArrayTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONArrayTransformerWithModelClass:")));
      
      @end
      

      【讨论】:

        猜你喜欢
        • 2014-08-20
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 2023-01-19
        • 1970-01-01
        相关资源
        最近更新 更多