Làm cách nào để gắn cờ một phương thức không được dùng trong Objective-C 2.0?


141

Tôi là thành viên của nhóm phát triển ứng dụng iPad khá lớn và kết quả là có nhiều lớp khác nhau mà chúng tôi đã tạo. Vấn đề là một số phương thức hiện đã khá lỗi thời và tôi không muốn xóa chúng đơn giản vì tôi biết một số phần của hệ thống tổng thể sử dụng các phương thức ... nhưng có những biến thể tốt hơn (mới hơn) nên được sử dụng thay vào đó (một số cái cũ thực sự gọi là cái mới, nhưng giao diện lớp tổng thể đang trở nên lộn xộn).

Có cách nào để tôi có thể đánh dấu các phương thức nhất định là không dùng nữa (như @deprecatedtrong Java và [Obsolete].NET).

Tôi thấy rằng Apple sử dụng Avcellence.h và có các thẻ như

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

... Đây có phải là cách duy nhất để làm điều đó (+ App Store có an toàn để làm việc này không?) Hoặc có những lựa chọn thay thế nào sẽ gắn cờ cảnh báo trong Xcode?

Câu trả lời:


163

Khấu hao cú pháp

Cú pháp được cung cấp để đánh dấu các phương thức là không dùng nữa:

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

hoặc là:

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

7
Macro này có ý nghĩa với tôi, nó giữ lại cảm giác của __attribute__cú pháp. #define __deprecated__ __attribute__((deprecated))
zekel

Thật thú vị Xcode không cho tôi bất kỳ cảnh báo nào về việc sử dụng một phương thức được đánh dấu là không dùng nữa. Có một cờ biên dịch cần được thiết lập?
memmons

Trong danh sách thả xuống hoàn thành mã của Xcode, tôi thấy rằng phương thức được đánh dấu là không dùng nữa, nhưng sử dụng nó không đưa ra cảnh báo về trình biên dịch.
memmons

1
@Answerbot Xây dựng cài đặt> cảnh báo về các chức năng không dùng nữa ... đặt cài đặt này thành CÓ
bandejapaisa

Làm thế nào để thêm phương pháp Thay thế nên được sử dụng?
OXXY

135

IMHO, viết __deprecated dễ dàng hơn:

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

Hoạt động quá trên các lớp học

__deprecated
@interface MyDeprecatedClass

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

@end

2
Cách tốt hơn nhiều để làm điều này.
SG1

1
Không có mô tả nào được cung cấp, vì vậy bạn sẽ không biết liệu mình nên sử dụng phương pháp khác hay gì ...
raistlin

1
#define __deprecated __attribution __ ((không dùng nữa))
Parag Bafna

Tại sao nó tốt hơn DEPRECATED_ATTRIBUTE? Chỉ vì nó ngắn hơn hoặc có sự khác biệt thực tế?
kelin

88

Nếu bạn muốn cung cấp thêm thông báo với cờ không dùng nữa, bạn có thể sử dụng các cờ sau.

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

Sử dụng các cờ được đề cập ở trên, bạn có thể cho biết lý do tại sao bạn phản đối hoặc nhà phát triển phương pháp nên sử dụng trong tương lai.


2
Tôi thích có một tin nhắn với một cảnh báo không dùng nữa. Nó hữu ích hơn nhiều cho người dùng mới của API. Vì vậy, tôi nghĩ rằng đây là câu trả lời tốt nhất.
johnnieb

Tôi thích câu trả lời này nhất, là rõ ràng nhất và dễ sử dụng nhất với bản sao-dán của những gì tôi cần. Bạn có thể vui lòng nâng cao nó với mẫu phản đối một phương pháp không? Cả lớp? Được thực hiện chính xác theo cùng một cách?
Motti Shneor

15

Để đánh dấu một phương thức là không dùng nữa, hãy sử dụng __attribution __ ((không dùng nữa ("Thông điệp của bạn ở đây")))

Một ví dụ thực tế, từ 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

14

Sử dụng deprecatedthuộc tính:

- (int)bar: (int)x __attribute__((deprecated));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.