2013-06-04 69 views
5

Trong Objective C có đoạn mã sau đó đánh dấu các phương pháp như đã lỗi thời:Sai số của các đối số cho thuộc tính

__attribute__((unavailable("message text")));

Mã này đã được đề xuất here, herehere, có thể ở một vài nơi nữa mà Tôi không thể nhớ ra đỉnh đầu của tôi ngay bây giờ.

Tôi không thể biên dịch mã này. Lỗi trình biên dịch tôi nhận được là "Số lượng đối số được chỉ định cho thuộc tính 'không có sẵn' sai. Lỗi tương tự cho thuộc tính không dùng nữa. Nếu tôi loại bỏ chuỗi nó biên dịch nhưng tôi muốn biết làm thế nào để biên dịch nó với chuỗi. Vì nó đã được đề xuất bởi nhiều người một cách độc lập và thậm chí đã được upvoted nó phải là mã làm việc. Nhưng tôi không thể làm cho nó biên dịch được.

Tôi đang làm gì sai? Làm thế nào để làm cho biên dịch này?

+0

Hãy thử sử dụng 'UNAVAILABLE_ATTRIBUTE' thay thế. Nó được định nghĩa trong các tiêu đề của Apple ở đâu đó, cùng với 'DEPRECATED_ATTRIBUTE'. – Greg

+0

Vâng, cảm ơn. Tôi đã thử điều đó, cũng không có hiệu lực. Nhưng câu hỏi của tôi ở đây không phải là về cách phản đối các phương thức nói chung mà là cách làm cho dòng mã này biên dịch. –

+0

Tôi bắt đầu nghĩ rằng không thể từ chối các phương thức mặc dù có các thuộc tính. Họ dường như không có hiệu lực. Meh. –

Trả lời

1

Trong tìm kiếm của mình, tôi đã tìm thấy tài liệu hướng dẫn về điều này; Clang Language Extensions

Phiên bản Xcode của tôi là 4.6.2, tôi đã thử LLVM-gcc không có ARC để đảm bảo rằng trình biên dịch gcc vẫn hoạt động với các tiện ích.

Trình biên dịch của tôi cho các tùy chọn C/C++/Objective-C; LLVM GCC 4.2 và trình biên dịch LLVM của Apple.

Cả hai thuộc tính này đều có trong tệp tiêu đề .h. Cả hai GCC LLVM và APPLE LLVM mất hai phong cách này

-(void)oldMethod __attribute((deprecated())); 
//or 
-(void)oldMethod2 DEPRECATED_ATTRIBUTE; 

LLVM GCC phàn nàn về các định dạng phương pháp sau đây, nơi mà như Apple LLVM làm việc đúng cách (này trả lời câu hỏi của bạn thực sự. Trình biên dịch của bạn đang sử dụng LLVM GCC hoặc một cái gì đó trở lên)

-(void)oldMethod __attribute((deprecated("Don't use Old Method"))); 

Câu chuyện dài ngắn, hãy nhớ sao lưu trước khi bạn làm rối tung những cài đặt và thay đổi này.

  1. Kiểm tra xem Xcode thích hợp có đang chạy hay không (4.6.2 mới nhất), tôi kết thúc bằng một phiên bản khác và phải dọn dẹp.

  2. Kiểm tra phiên bản trình biên dịch nào có sẵn trong cài đặt dự án trong "Tùy chọn xây dựng". (Tôi đã chỉ ra câu trả lời ở trên)

  3. Đối với các dự án cũ hơn, bạn có thể muốn kiểm tra việc tái cấu trúc với ARC và Chuyển đổi thành mục tiêu hiện đại-c. Chỉ cần chắc chắn để giữ một bản sao lưu, trên các dự án lớn hơn nó có thể là một rắc rối. (Edit-> Refactor-> Objective-C hiện đại) Video; WWDC 2011 Refactoring với Automatic Reference Counting WWDC 2012 Modern Objective-C Videos https://developer.apple.com/videos/wwdc/2012/

    Lưu ý: Objective-C refactoring hiện đại sẽ thay đổi để trình biên dịch của Apple-LLVM. Cùng với những thay đổi khác.

Nếu câu trả lời này là cốt lõi trong câu hỏi của bạn, hãy giúp tôi bằng cách bỏ phiếu! TIA!

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