2012-07-11 30 views
12

Tôi cần phải ngừng sử dụng một phương thức duy nhất trong giao thức khách quan-c. Trên các phương thức lớp/thể hiện bình thường, tôi thêm __attribute__ ((deprecated)); sau khi khai báo.__attribute__ ((không được chấp nhận)) không hoạt động trên các phương thức giao thức khách quan-c?

Dường như, nó không hoạt động trên các phương thức giao thức. Nếu tôi đánh dấu chúng không được chấp nhận và sử dụng chúng ở đâu đó thì dự án sẽ biên dịch OK, không có cảnh báo không dùng nữa.

Đó có phải là lỗ hổng trong Apple LLVM 3.1 hay tôi đang làm điều gì sai?

+0

Điều này vẫn xảy ra trong LLVM 5.0. Mặc dù trình biên dịch không hiển thị cảnh báo, nó sẽ vượt qua phương thức bằng một đường màu đỏ khi sử dụng Xcode tự động hoàn thành. Bất kỳ từ nào về điều này? –

Trả lời

7

Mặc dù câu trả lời ở đây cung cấp một số thông tin rất tốt, chúng đã lỗi thời. Bắt đầu với Xcode 5.0 và LLVM 5.0 có vẻ như cảnh báo không dùng nữa cho các phương thức giao thức Objective-C được nhận ra. Khi thực hiện phương pháp này, Xcode 5 cờ nó:

Cảnh báo: Thực hiện phản đối phương pháp

Dưới đây là các bước tôi đã sử dụng để tạo ra một cảnh báo không dùng nữa để thực hiện một phương pháp giao thức phản đối:

  1. Đánh dấu phương thức giao thức là không dùng nữa bằng cách sử dụng __deprecated. Từ tài liệu SDK 7.0 mới:

    __deprecated causes trình biên dịch để tạo cảnh báo khi gặp mã bằng chức năng không dùng nữa. __deprecated_msg() thực hiện tương tự và các trình biên dịch hỗ trợ nó sẽ in thông báo cùng với cảnh báo không dùng nữa. Điều này có thể yêu cầu bật cảnh báo như vậy với cờ -Wdeprecated. __deprecated_enum_msg() nên được sử dụng trên enums và các trình biên dịch hỗ trợ nó sẽ in cảnh báo không dùng nữa.

    #define __deprecated __attribute__((deprecated)) 
    

    không chấp phương pháp của bạn, làm một cái gì đó như thế này:

    - (void)aDeprecatedProtocolMethod __deprecated; 
    

    này một mình nên đủ cho Xcode để hiển thị một cảnh báo không dùng nữa. Tuy nhiên, bạn nên làm theo các bước tiếp theo (biết rằng Xcode có thể rất khó tính ở lần) để đảm bảo cảnh báo hiển thị.

  2. Thêm nhận xét tài liệu với thẻ cảnh báo không dùng nữa. Xem ví dụ mã dưới đây để học cách:

    /** Describe the method here - what does it do, how does it work, etc. Very brief. 
        @deprecated This delegate method is deprecated starting in version 2.0, please use otherMethodNameHere:withAnExtraParameter: instead. */ 
    - (void)aDeprecatedProtocolMethod __deprecated; 
    
  3. sạch các dự án ( + + K) và sau đó xây dựng các dự án ( + B) - chỉ vì Xcode đôi khi có thể sôi nổi.

Tôi không chắc chắn 100% khi nào hoặc ở đâu tính năng này được giới thiệu (có thể với SDK 7.0 và 10.9 hoặc Xcode 5.0/5.0.1 hoặc LLVM 5.0) - nhưng nó vẫn hoạt động.

3

Apple không dùng một số phương thức trong giao thức UITableViewDelegate, có lẽ bạn sẽ có thể tìm giải pháp bằng mã của Apple làm ví dụ.

Mã liên quan của Nghị định thư thực hiện như sau:

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView 
     accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath 
__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0); 

Như bạn có thể thấy, Apple sử dụng một macro. Có lẽ đây là con đường để đi?

CHỈNH SỬA: Như đã lưu ý trên liên kết sau [1] __attribute__((deprecated)) là cấu trúc GCC để điều này có thể không hoạt động trong LLVM. Tôi đoán đây là lý do Apple sử dụng các macro, vì vậy một số cấu trúc không dùng nữa (hoặc không) sẽ được gọi khi các trình biên dịch khác được sử dụng.

[1] How to deprecate a method in Xcode

+0

Macro mở rộng thành '__attribute __ ((tính khả dụng (ios, giới thiệu = 2.0, không dùng nữa = 3.0)))'. Xem trong 'Availability.h' và' AvailabilityInternal.h' (cả trong '/ usr/include /') – JustSid

+0

Có, họ nói về GCC, nhưng __attribute __ ((không được chấp nhận)) thực sự hoạt động trên Apple LLVM, ngoại trừ các giao thức. Nó đang gây nhầm lẫn vào lúc này. –

4

Vâng, tôi chỉ nhận ra, mà ngay cả của Apple sử dụng __attribute__((deprecated)) ở cuối. Và nó cũng không hoạt động. Nếu tôi sử dụng bất kỳ phương thức ủy quyền không được chấp thuận nào, ví dụ:

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView 
    accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath 

không có cảnh báo.

Vì vậy, nó có vẻ giống như một ứng cử viên cho radar.

EDIT: đã gửi radar, ID lỗi # 11849771.

+0

bất kỳ cập nhật nào về 'ID lỗi # 11849771'? – Vasu

+0

thật không may, không –

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