如何在Objective-C 2.0中将方法标记为已弃用?

Jam*_*man 139 iphone objective-c deprecated

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

有没有一种方法可以将某些方法标记为折旧(如@deprecated在Java和[Obsolete].NET中).

我看到Apple使用Availability.h并且有标签,例如

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);
Run Code Online (Sandbox Code Playgroud)

...这是唯一的方法(+ App Store是否可以安全地执行此操作?)或者是否有替代方案会在Xcode中标记警告?

Sha*_*men 159

弃用语法

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

@interface SomeClass
-method __attribute__((deprecated));
@end
Run Code Online (Sandbox Code Playgroud)

要么:

#include <AvailabilityMacros.h>
@interface SomeClass
-method DEPRECATED_ATTRIBUTE;  // or some other deployment-target-specific macro
@end
Run Code Online (Sandbox Code Playgroud)

  • 这个宏对我来说很有意义,它保留了`__attribute__`语法的感觉.`#define __deprecated__ __attribute __((不建议使用))` (7认同)

Víc*_* B. 133

恕我直言,写__deprecated更容易:

- (void)myDeprecatedMethod __deprecated;
- (int)methodNameDeprecated:(int)param __deprecated;
Run Code Online (Sandbox Code Playgroud)

也适用于课程

__deprecated
@interface MyDeprecatedClass

  // ... some properties and methods ...

@end
Run Code Online (Sandbox Code Playgroud)

  • 这是一个两年前的问题,但无论如何,谢谢!:) (7认同)
  • 更好的方法来做到这一点. (2认同)
  • 没有提供描述,所以你不知道是否应该使用不同的方法或什么...... (2认同)

uir*_*han 84

如果要使用弃用标志提供其他消息,可以使用以下标志.

@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.")));
Run Code Online (Sandbox Code Playgroud)

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

  • 我希望收到一条带有弃用警告的消息。对于API的新用户而言,它更加有用。因此,我认为这是最好的答案。 (2认同)

onm*_*133 15

要将方法标记为已弃用,请使用__attribute __((不建议使用("您的消息在此处")))

来自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
Run Code Online (Sandbox Code Playgroud)


Ste*_*non 14

使用deprecated属性:

- (int)bar: (int)x __attribute__((deprecated));
Run Code Online (Sandbox Code Playgroud)