Objective-C 2.0에서 메소드를 더 이상 사용되지 않는 것으로 플래그 지정하려면 어떻게합니까?


141

나는 상당히 큰 iPad 앱을 개발하는 팀의 일원이며 우리가 만든 많은 클래스가 있습니다. 문제는 일부 메소드가 이제 거의 쓸모가 없어서 전체 시스템의 일부가 메소드를 사용한다는 것을 알기 때문에 단순히 제거하고 싶지는 않지만 사용할 수있는 더 나은 (최신) 변형이 있음 대신 (오래된 것 중 일부는 실제로 새로운 것을 호출하지만 전체 클래스 인터페이스가 지저분 해집니다).

@deprecatedJava 및 [Obsolete].NET에서 와 같이 특정 메소드를 감가 상각 된 것으로 표시 할 수있는 방법이 있습니까?

Apple이 Availability.h를 사용하고 다음과 같은 태그를 가지고 있음을 알았습니다.

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

...이 작업을 수행하는 유일한 방법입니까 (+ App Store가 안전한가요?) Xcode에서 경고를 표시하는 대안이 있습니까?

답변:


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

흥미롭게도 Xcode는 감가 상각으로 표시된 방법을 사용하는 것에 대해 경고하지 않습니다. 컴파일러 플래그를 설정해야합니까?
memmons

Xcode의 코드 완성 드롭 다운에서 메소드가 감가 상각 된 것으로 표시되어 있지만 사용하면 컴파일러 경고가 표시되지 않습니다.
memmons

1
@Answerbot 빌드 설정> 더 이상 사용되지 않는 기능에 대한 경고 ... 이것을 YES로 설정
bandejapaisa

사용해야하는 대체 방법을 추가하는 방법은 무엇입니까?
OXXY

135

IMHO, __deprecated를 작성하는 것이 더 쉽습니다.

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

수업에서도 작동

__deprecated
@interface MyDeprecatedClass

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

@end

2
훨씬 더 좋은 방법입니다.
SG1

1
설명이 제공되지 않으므로 다른 방법을 사용해야하는지 또는 무엇을 사용해야하는지 알 수 없습니다.
raistlin

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

왜 이보다 낫 DEPRECATED_ATTRIBUTE습니까? 그것이 더 짧거나 실제 차이가 있다고해서?
kelin

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 2014

이 답변이 가장 마음에 듭니다. 필요한 것만 복사하여 붙여 넣기를하는 것이 가장 명확하고 쉽습니다. 더 이상 사용되지 않는 메소드 샘플로이를 향상시킬 수 있습니까? 전체 수업? 정확히 같은 방법입니까?
Motti Shneor

15

더 이상 사용되지 않는 방법으로 표시하려면 다음을 사용하십시오. __attribute __ ((deprecated ( "메시지가 여기에 있습니다")))

맨틀의 실제 사례

@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

14

deprecated속성을 사용하십시오 .

- (int)bar: (int)x __attribute__((deprecated));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.