在Objective-C 2.0中,我该如何标记一个方法已过时?

149

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

是否有一种方法可以将某些方法标记为已弃用(例如Java中的@deprecated和.NET中的[Obsolete])?

我看到苹果使用Availability.h并具有诸如

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

这是唯一的方法吗?(还有这样做是否在App Store上安全?)或者是否有其他替代方案可以在Xcode中标记警告?

5个回答

166

不推荐使用的语法

提供了语法来标记方法已被弃用:

@interface SomeClass
-method __attribute__((deprecated));
@end
或者:
#include <AvailabilityMacros.h>
@interface SomeClass
-method DEPRECATED_ATTRIBUTE;  // or some other deployment-target-specific macro
@end

7
这个宏对我来说很有意义,它保留了__attribute__语法的感觉。#define __deprecated__ __attribute__((deprecated)) - zekel
有趣的是,Xcode在我使用被标记为已弃用的方法时没有给我任何警告。需要设置编译器标志吗? - memmons
在Xcode的代码自动补全下拉菜单中,我看到该方法被标记为已弃用(deprecated),但使用它并没有给编译器警告。 - memmons
1
@Answerbot 构建设置 > 警告已弃用的函数...将其设置为YES。 - bandejapaisa
如何添加应该使用的备用方法? - OXXY
也许这不是非常重要,但是在浏览函数列表时,DEPRECATED_ATTRIBUTE 更容易被注意到。 - kelin

141

据我看来,写成__deprecated会更容易:

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

这也适用于类

__deprecated
@interface MyDeprecatedClass

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

@end

2
做这件事的更好方式。 - SG1
2
没有提供描述,因此您将不知道是否应该使用不同的方法或什么... - raistlin
1
#define __deprecated attribute((deprecated)) - Parag Bafna
为什么它比DEPRECATED_ATTRIBUTE更好?仅仅因为它更短吗,还是有任何实际的区别? - kelin

95

如果您想在弃用标志(deprecation flag)中附加额外的消息,可以使用以下标志。

@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.")));

使用上述标记,您可以说明为什么要弃用,或者开发人员应该在未来使用哪种方法。


3
我更喜欢带有弃用警告的信息。对于 API 的新用户来说,这会更加有帮助。因此,我认为这是最好的答案。 - johnnieb
我最喜欢这个答案,因为它最清晰、最易于使用,只需复制粘贴我所需的内容。您能否请在其中加入一个废弃方法和整个类的示例?这是完全以相同的方式完成吗? - Motti Shneor

18

要将一个方法标记为已弃用,请使用__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

16

使用deprecated属性:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接