2011-11-15 8 views
5

Tôi nên phản hồi cảnh báo này như thế nào?: định nghĩa giao thức trùng lặp của '...' bị bỏ qua

cảnh báo: lặp lại định nghĩa giao thức của '...' bị bỏ qua

khai giao thức của tôi là trong file .h của riêng mình, và nó đượC# import'ed trong một vài tác phẩm khác trong tôi dự án.

Vâng, chỉ trong trường hợp, đây là toàn bộ tập tin tiêu đề với việc kê khai giao thức:

#import <Foundation/Foundation.h> 

@class Wrapper; 

@protocol WrapperDelegate 

@required 
- (void)wrapper:(Wrapper *)wrapper didRetrieveData:(NSData *)data; 

@optional 
- (void)wrapperHasBadCredentials:(Wrapper *)wrapper; 
- (void)wrapper:(Wrapper *)wrapper didCreateResourceAtURL:(NSString *)url; 
- (void)wrapper:(Wrapper *)wrapper didFailWithError:(NSError *)error; 
- (void)wrapper:(Wrapper *)wrapper didReceiveStatusCode:(int)statusCode; 

@end 

Cảm ơn lời khuyên.

+7

1. Bạn có chắc chắn rằng bạn đang '# import' vào nó và không phải' # include'ing nó một cách tình cờ? 2. Bạn có chắc chắn (giá trị yêu cầu) rằng không có gì khác trong dự án của bạn sử dụng cùng một tên (WrapperDelegate)? –

+0

Nhận xét của Quixoto có vẻ nghi ngờ giống như câu trả lời :) Tôi đã gặp vấn đề tương tự khi tôi sử dụng nhầm #include. #import đủ thông minh để tránh trùng lặp. –

Trả lời

5

Kiểm tra để đảm bảo bạn không thêm tệp tiêu đề vào dự án của mình hai lần hoặc hai tệp khác nhau vừa triển khai giao thức. Đây là những gì khiến cảnh báo xuất hiện cho tôi.

+4

Điều gì sẽ xảy ra nếu tôi có hai lớp thực hiện cùng một giao thức? cả hai đều cần nó, vậy làm thế nào để tôi có được điều đó? – zach

+2

@zach (hoặc bất kỳ ai khác có cùng vấn đề) - Tôi đã gặp phải vấn đề này và đã đăng câu hỏi, hiện đã được trả lời [ở đây] (http://stackoverflow.com/questions/10001293/duplicate-protocol-definition- cảnh báo-nhưng-tôi-cần-bội số-của-giao thức này/10001416 # 10001416). – Squatch

3

Vâng tôi đã gặp phải vấn đề tương tự. Tôi không thể tìm thấy tệp tiêu đề trùng lặp trong dự án Xcode. Nhưng khi tôi đi qua công cụ tìm từ Xcode, tôi tìm thấy tệp tiêu đề 2 của giao thức trong dự án. Xóa một giải pháp đã giải quyết được vấn đề. Cảm ơn.

1

Chỉ để bổ sung các câu trả lời hiện có tại đây với sự cố cụ thể mà tôi gặp phải.

Về cơ bản, trình biên dịch không nằm. Nó đang tìm nhiều hơn một định nghĩa của một lớp, giao thức, enum, xác định, hoặc bất cứ điều gì tồn tại trong các tập tin tiêu đề vi phạm.

Lỗi có thể là kết hợp các tệp tiêu đề của bạn và đường dẫn tìm kiếm tiêu đề.

Lúc đầu, các vấn đề có vẻ khó hiểu vì chúng tôi biết rằng tuyên bố #import sẽ chỉ nhập các tệp chưa được triển khai. Do đó, không giống như #include, vấn đề này không nên xảy ra, đúng không?

#import không hoạt động. Tuy nhiên, nếu tiêu đề của bạn đã được thiết lập không chính xác thì mặc dù nó có thể gặp phải một tệp có cùng tên, ví dụ: MyLibrary.h, nếu tệp đó tồn tại ở hai vị trí khác nhau, cả hai đều nằm trong đường dẫn tìm kiếm tiêu đề thì Xcode sẽ nhận ra chúng là hai tệp khác nhau.

Trong trường hợp của tôi, tôi đã có một giai đoạn xây dựng thư viện tĩnh sao chép các tiêu đề công khai.

enter image description here

Các sản phẩm phụ thuộc đã tìm kiếm các thư mục trên - được định nghĩa trong Cài đặt xây dựng như include/$(TARGET_NAME)- thư mục nguồn của dự án của tôi.

Điều đó có nghĩa là hai thư mục khác nhau - cả trong đường dẫn tìm kiếm tiêu đề - chứa tệp MyLibrary.h. Tất cả mọi thứ trong tập tin đó sẽ gây ra một cảnh báo hoặc lỗi trình liên kết biên dịch hoặc định nghĩa lại trình biên dịch.

TLDR: cùng một tệp có thể nằm trong hai thư mục khác nhau và cả hai đều nằm trong đường dẫn tìm kiếm tiêu đề của bạn. Kiểm tra đường dẫn của bạn và nếu bạn đã kết hợp thư viện tĩnh vào dự án hoặc không gian làm việc, hãy kiểm tra xem các tiêu đề công khai được sao chép vào như một phần của cuộc điều tra của bạn.