2012-11-14 22 views
7

Tôi đang làm việc trên một dự án ban đầu được xây dựng trong XCode 4.0, và sau đó di chuyển sang sử dụng XCode 4.2. Bây giờ tôi đã thử nghiệm di chuyển sang XCode 4.5 và tôi nhận được rất nhiều cảnh báo như bên dưới ...XCode 4.5 cảnh báo về xung đột tên phương thức giữa Danh mục cho lớp cha/con

instance method 'values' in category from <pathToTheFile>/HistoryObject+extras.o conflicts with same method from another category 

Những cảnh báo này không bao giờ xuất hiện trong các phiên bản trước của XCode và mã không thay đổi.

Dự án được đặt ở iOS 4.3 cho Mục tiêu triển khai. Vì vậy, chúng tôi có từ một nhà phát triển trước một loạt các lớp DAO mà tôi tin là được tạo tự động từ CoreData, và sau đó mỗi lớp này có một Danh mục mở rộng nó để triển khai một số phương thức nhất định. Tôi sẽ đưa ra một ví dụ ...

Chúng tôi có một lớp cơ sở có tên LisaObject kế thừa từ NSManagedObject và nó có một danh mục tên là LisaObject + extras. Trong phần bổ sung của LisaObject +, có một phương thức có tên là "các giá trị" trả về một NSMutableDictionary.

Sau đó, chúng tôi có một lớp có tên là HistoryObject kế thừa từ LisaObject. Ngoài ra còn có một Category cho HistoryObject được đặt tên là HistroyObject + extras. Danh mục này cũng có một phương thức có tên là "giá trị". Trong phương thức giá trị bổ sung HistoryObject +, nó gọi [siêu giá trị], và sau đó kiểm tra một số điều kiện và đặt một số giá trị bổ sung trong từ điển không được đặt trong phương thức lớp cơ sở.

Sau đó, chúng tôi có một lớp có tên LessonStatusObject kế thừa từ HistoryObject và nó cũng có danh mục Tên là LessonStatusObject +, có một phương thức có tên là giá trị. Phương thức giá trị này cũng gọi [siêu giá trị] và sau đó thực hiện một số công việc bổ sung trên từ điển được trả về.

Đối với mỗi phương pháp "giá trị" này, chúng tôi nhận được cảnh báo tại thời gian biên dịch như được hiển thị ở trên, trong đó Danh mục có phương pháp có tên xung đột.

Tôi có một vài câu hỏi về điều này.

Trước tiên, việc triển khai này có thể gây ra bất kỳ vấn đề chính đáng nào hay những cảnh báo này thường lành tính? Tôi đã cố gắng để suy nghĩ về cách thực hiện này có thể gây ra một sự mơ hồ trong thời gian chạy, nhưng tôi không thấy làm thế nào mà có thể xảy ra.

Thứ hai, có điều gì mà tôi nên làm để sửa những cảnh báo này (và tôi không có nghĩa là chỉ khiến chúng ngừng xuất hiện; ý tôi là sửa chữa nguyên nhân)? Có cách nào khác chúng ta nên đi về việc này?

Ngoài ra, tại sao XCode 4.2 không cảnh báo về điều này, nhưng XCode 4.5 cảnh báo?

Tôi có hiểu nhầm điều gì về Danh mục không? Ý tôi là, nếu phương thức "values" thực sự là một phần của việc thực hiện từng lớp, thì sẽ không có vấn đề gì khi ghi đè chúng theo cách chúng ta làm, nhưng trình biên dịch dường như chỉ đơn giản là vì đây là các Category. Có điều gì không an toàn về điều này không?

Bất kỳ lời khuyên nào được đánh giá cao.

CHỈNH SỬA: Chỉ để cung cấp thêm thông tin ... Khi chúng tôi đang sử dụng XCode 4.2, dự án có trình biên dịch được đặt thành Apple LLVM Compiler 3.0. Bây giờ khi tôi mở dự án trong XCode 4.5, nó có trình biên dịch được đặt thành Apple LLVM Compiler 4.1.

+0

Hãy tìm hiểu cách phân biệt giữa IDE (Xcode) và trình biên dịch (Clang, tôi giả sử). Trình biên dịch là trình biên dịch cho bạn các cảnh báo chứ không phải Xcode. Xcode chỉ là giao diện người dùng. –

Trả lời

4

Đừng bỏ qua cảnh báo.

của Apple "Lập trình Với Objective-C" hướng dẫn, trong phần "Customizing Existing Classes", nói:

Nếu tên của một phương pháp tuyên bố trong một thể loại cũng giống như một phương pháp trong lớp gốc hoặc một phương thức trong một danh mục khác trên cùng một lớp (hoặc thậm chí là một lớp cha), hành vi này không được xác định là thực hiện phương pháp được sử dụng khi chạy.

Nếu nó đã làm việc cho bạn, thì thật may mắn.

+0

Tôi có thể hiểu được sự mơ hồ sẽ tồn tại như thế nào với hai loại trên cùng một lớp mà cả hai đều có cùng tên phương thức. Tôi không thấy mặc dù sự mơ hồ sẽ tồn tại như thế nào khi một siêu lớp và phân lớp có hai loại khác nhau với các phương thức có tên giống nhau. Làm thế nào mà bất kỳ khác nhau từ trọng một phương pháp dụ bình thường? Bạn có thể giải thích nếu có sự khác biệt về các danh mục có thể gây ra sự mơ hồ? – Jim

+0

Tôi thực sự không biết cụ thể lý do tại sao hành vi này không được xác định, đó là lý do tôi trì hoãn tài liệu của Apple. Chắc chắn tôi sẽ quan tâm để biết tại sao, bản thân mình. –

+0

Cảm ơn bạn đã trả lời. Tuy nhiên, tôi thực sự muốn biết nếu nó cần thiết để thực hiện những thay đổi lớn để sửa chữa tất cả các cảnh báo nếu có thực sự không bao giờ có thể có bất kỳ cách nào để gây ra một sự mơ hồ hợp pháp trong thời gian chạy. Đó là lý do tại sao hai loại trên cùng một lớp với cùng tên phương thức sẽ gây ra sự mơ hồ, nhưng không có lý do tại sao hai loại trên hai lớp khác nhau là cha mẹ/con có thể gây ra sự mơ hồ. Nó chỉ không có ý nghĩa; mỗi lớp có tập các phương thức riêng của họ, và đứa trẻ nên ghi đè lên tên của cha mẹ nếu được đặt tên giống nhau. Cách sử dụng Danh mục thay đổi điều đó như thế nào? – Jim

28

Tôi đã gặp vấn đề tương tự gây phiền nhiễu này và hóa ra tôi đã vô tình đưa tệp .m của danh mục đó thay vì tệp .h vào một trong mã của VC của tôi. Sửa nó thành tệp .h đã loại bỏ các cảnh báo của trình liên kết.

+0

Cảm ơn bạn đã gợi ý, tôi sẽ kiểm tra để đảm bảo rằng đó không phải là vấn đề. – Jim

+6

Điều này cũng xảy ra với tôi. Tôi đề nghị bất kỳ ai khác nhìn thấy tìm kiếm này toàn bộ dự án của họ cho chuỗi '.m' '. –

0

Tôi cũng gặp sự cố này, nhưng lại bị gây ra bởi một điều gì đó khác. Đối với tôi đó là danh mục đã được thêm vào dự án Xcode hai lần! Tôi đã không phát hiện ra rằng đó là trường hợp cho đến khi tôi đã đi đến đổi tên một trong những phương pháp và thấy trong xem trước refactoring rằng nó được liệt kê các tập tin thể loại hai lần.