如何在Objective-C 2.0中将方法标记为不推荐使用?


141

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

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

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

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

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

Answers:


163

弃用语法

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

@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 2011年

有趣的是,对于使用标记为已贬值的方法,Xcode不会给我任何警告。是否需要设置编译器标志?
记忆

在Xcode的代码完成下拉列表中,我看到该方法被标记为已弃用,但是使用它不会发出编译器警告。
记忆

1
@Answerbot构建设置>警告不推荐使用的功能...将此设置为YES
bandejapaisa 2012年

如何添加应使用的替代方法?
OXXY

135

恕我直言,编写__deprecated更容易:

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

在班上也可以

__deprecated
@interface MyDeprecatedClass

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

@end

2
更好的方法来做到这一点。
SG1 2013年

1
没有提供描述,所以您将不知道是否应该使用其他方法或使用什么方法……
raistlin

1
#define __deprecated __attribute __((deprecated))
Parag Bafna

为什么比这更好DEPRECATED_ATTRIBUTE?只是因为它更短还是有实际差异?
凯林

88

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

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

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


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

我最喜欢这个答案,它是我需要的最清晰,最容易使用的复制粘贴工具。您还可以通过弃用方法的示例来增强它吗?全班?完全一样吗?
Motti Shneor

15

要将方法标记为不推荐使用,请使用__attribute __((deprecated(“您的消息在此处”)))

一个实际的例子,来自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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.