Cách ngừng sử dụng một phương thức trong Xcode


79

Chúng tôi có thư viện mà 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 dùng nữa" vì chúng tôi đã thay đổi chúng (giống như Apple làm trong SDK iPhone).

Tôi đã thấy __OSX_AVAILABLE_BUT_DEPRECATEDmacro bộ xử lý trước, được ánh xạ tới __AVAILABILITY_INTERNAL, được ánh xạ tới __attribute__((deprecated))...

Vâng, tôi hơi bối rối với những thứ này!

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

Câu trả lời:


150

__attribute__((deprecated))cách gcc (cũng được hỗ trợ trong clang ) để đánh dấu một hàm / phương thức là không được dùng nữa. Khi một thiết bị được đánh dấu là "không được dùng nữa", một cảnh báo sẽ được đưa ra bất cứ khi nào có bất kỳ ai gọi nó.

Cú pháp cho các hàm 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à phương pháp Objective-C sẽ là

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

Bạn cũng có thể đánh dấu cả lớp là không dùng nữa với

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

Apple cũng cung cấp <AvailabilityMacros.h>tiêu đề 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 @availablethuộc tính để phản đối một mục, ví dụ:

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

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: có thể thêm thông báo như "Sử dụng phương pháp XXX thay thế" không?
Julien

22
@Julien: Có: __attribute((deprecated(use method XXX instead))). Nhưng cú pháp này chỉ có sẵn bắt đầu từ gcc 4.5, và phiên bản vận chuyển với Xcode 4.2 ...
kennytm

Nếu tôi chỉ thêm thuộc tính không dùng nữa vào khai báo phương thức, trình biên dịch sẽ nói "Các thuộc tính khi triển khai phương thức và khai báo của nó phải khớp". Tôi có cần thêm smth để triển khai phương thức không?
Borut Tomazin

2
Đây không phải là câu trả lời được chấp nhận. Đó không phải là cách Apple đã làm điều đó, và đó là cách xấu xí hơnDEPRECATED_ATTRIBUTE
Adlai Holler

74

Bạn cũng có thể sử dụng định nghĩa dễ đọc hơn DEPRECATED_ATTRIBUTE

Nó được định nghĩa trong usr/include/AvailabilityMacros.h:

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

Ví dụ về phương pháp Objective-C :

@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

Bạn cũng có thể đánh dấu cả lớp là không dùng nữa:

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

2
Đây cũng là cách Apple làm 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, đó không phải là câu trả lời đã chọn, hay câu trả lời được bình chọn cao hơn.
Benjohn

làm thế nào tôi có thể sử dụng DEPRECATED_MSG_ATTRIBUTEđể đánh dấu một lớp học như bị phản đối với thông điệp (như UIAlertView)
Multinerd

1
Có khái niệm 'đổi tên' tương tự như các thuộc tính có sẵn trong Swift không?
Joe Susnick

5

Swift 5.0

Không chấp nhận bất kỳ phương thức / lớp / cấu trúc / giao thức nào sử dụng @available

@available(*, deprecated, message: "Parse your data by hand instead")
func parseData() { }

@available(*, deprecated, renamed: "loadData")
func fetchData() { }

@available(swift, obsoleted: 4.1, renamed: "attemptConnection")
func testConnection() { }

@available(swift, deprecated: 4.0, obsoleted: 5.0, message: "This will be removed in v5.0; please migrate to a different API.")

Các thông số có thể có:

  • giới thiệu
  • không dùng nữa
  • bị che khuất
  • thông điệp
  • đổi tên

Để biết thêm thông tin, hãy xem apple doc: Attributes



0

- ĐỐI VỚI MÃ SWIFT:

Đặt điều này ngay trên phương thức: @available(*, deprecated: <#Version#>, message: <#Message#>)

thí dụ:

@available(*, deprecated: 11, message: "Use color assets instead")
public struct ColorPaletteItemResource: ColorPaletteItemResourceType {
    ...
}
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.