2011-02-07 25 views
70

Chúng tôi có thư viện chúng tôi gửi cho khách hàng và tôi muốn đánh dấu một số phương pháp là "không được chấp nhận" vì chúng tôi đã thay đổi chúng (như Apple thực hiện trong SDK iPhone).Cách sử dụng phương pháp này trong Xcode

Tôi đã nhìn thấy những vĩ mô __OSX_AVAILABLE_BUT_DEPRECATED tiền xử lý, được ánh xạ tới __AVAILABILITY_INTERNAL, được ánh xạ tới __attribute__((deprecated)) ...

Vâng tôi là một chút nhầm lẫn với công cụ này!

Có ai biết gì về điều đó không?

Trả lời

141

__attribute__((deprecated))gcc way (cũng supported in clang) đánh dấu một chức năng/phương pháp không được chấp nhận. Khi một được đánh dấu là "không được chấp nhận", một cảnh báo sẽ được tạo ra bất cứ khi nào có ai gọi nó.

Cú pháp cho các chức năng bình thường sẽ là

__attribute__((deprecated)) 
void f(...) { 
    ... 
} 

// gcc 4.5+/clang 
__attribute__((deprecated("g has been deprecated please use g2 instead"))) 
void g(...) { 
    ... 
} 

và rằng các phương pháp Objective-C sẽ

@interface MyClass : NSObject { ... } 
-(void)f:(id)x __attribute__((deprecated)); 
... 
@end 

Bạn cũng có thể đánh dấu cả lớp như bị phản đối với

__attribute__((deprecated)) 
@interface DeprecatedClass : NSObject { ... } 
... 
@end 

Apple cũng cung cấp tiêu đề <AvailabilityMacros.h> cung cấp các macro DEPRECATED_ATTRIBUTE và DEPRECATED_MSG_ATTRIBUTE (msg) mở rộng đến các thuộc tính ở trên hoặc không có gì nếu trình biên dịch không hỗ trợ các thuộc tính. Lưu ý rằng tiêu đề này không tồn tại bên ngoài OS X/iOS.


Lưu ý bên cạnh, nếu bạn đang sử dụng Swift, bạn sử dụng @available attribute để ngừng sử dụng một mục, ví dụ:

@available(*, deprecated=2.0, message="no longer needed") 
func f() { 
    ... 
} 
+0

Cảm ơn bạn đã trả lời nhanh chóng này, tôi khá chắc chắn nó sẽ giúp đỡ, tôi đã tìm kiếm trong một thời gian trước khi hỏi :) – Julien

+1

Tôi chỉ có một câu hỏi khác: là nó có thể để thêm một thông điệp như "Sử dụng phương pháp XXX thay thế"? – Julien

+21

@Julien: Có: '__attribute ((không được chấp nhận (sử dụng phương thức XXX thay thế)))'. Nhưng cú pháp này chỉ có sẵn bắt đầu từ gcc 4.5, và phiên bản được vận chuyển với Xcode là 4.2 ... – kennytm

64

Bạn cũng có thể sử dụng dễ đọc hơn xác địnhDEPRECATED_ATTRIBUTE

Nó quy định tại usr/include/AvailabilityMacros.h:

#define DEPRECATED_ATTRIBUTE  __attribute__((deprecated)) 
#define DEPRECATED_MSG_ATTRIBUTE(msg) __attribute((deprecated((msg)))) 

Objective-C phương pháp dụ:

@interface MyClass : NSObject { ... } 
-(void)foo:(id)x DEPRECATED_ATTRIBUTE; 

// If you want to specify deprecated message: 
-(void)bar:(id)x DEPRECATED_MSG_ATTRIBUTE("Use baz: method instead."); 
... 
@end 
.210

Bạn cũng có thể đánh dấu cả lớp như bị phản đối:

DEPRECATED_ATTRIBUTE 
@interface DeprecatedClass : NSObject { ... } 
... 
@end 
+2

Đây cũng là cách Apple thực hiện nó trong các lớp iOS. Có lẽ là phương pháp tốt hơn. – LunaCodeGirl

+2

Đó chắc chắn là phương pháp tốt hơn. Đáng tiếc nó không phải là câu trả lời được chọn, hoặc câu trả lời bình chọn cao hơn. – Benjohn

+0

làm cách nào tôi có thể sử dụng 'DEPRECATED_MSG_ATTRIBUTE' để đánh dấu một lớp là không được chấp nhận với thông báo (như UIAlertView) – Multinerd

1

Nếu bạn đang sử dụng C++ 14 trong dự án xcode của bạn, bạn cũng có thể sử dụng [[deprecated]] hoặc [[deprecated("reason")]] thuộc tính mà bây giờ là một phần của ngôn ngữ.

xem tài liệu: http://en.cppreference.com/w/cpp/language/attributes

Các vấn đề liên quan