2010-08-07 37 views
12

Tôi đã gặp sự cố Objective-C dường như không có ý nghĩa gì đối với tôi. Tôi là một lập trình viên ObjC tương đối thành thạo và hiểu toàn bộ khái niệm "tuyên bố về phía trước", nhưng cái này khiến tôi gãi đầu. Vì vậy, đây là thỏa thuận:"Không thể tìm thấy lỗi khai báo giao diện ..." sau @class

ClassA là một lớp trong dự án Xcode của tôi chỉ là dự án. ClassB là lớp con của ClassA công khai và được nhập vào tiêu đề khung của tôi.

Tôi nhận được thông báo "Không thể tìm thấy giao diện cho 'ClassA', siêu lớp của 'ClassB' ..." lỗi khi xây dựng. Tôi đã đặt tuyên bố chuyển tiếp @class ClassA; trong ClassB.h, nhưng điều đó dường như không giải quyết được vấn đề. Khi tôi thay đổi @class ClassA; thành #import ClassA.h, nó hoạt động tốt. Tuy nhiên, vì ClassA chỉ là dự án, các dự án phụ thuộc không thể xây dựng ClassB vì nó không thể truy cập nguồn của ClassA.

Bất kỳ trợ giúp nào sẽ được đánh giá cao và tôi hy vọng điều đó có ý nghĩa. Cảm ơn!

Trả lời

10

Để phân lớp một lớp, khai báo đầy đủ của lớp cha phải có sẵn cho trình biên dịch. @class chỉ cho phép tham chiếu đến các phiên bản của lớp đã nói - cho phép A *foo;.

subclassing đòi hỏi siêu dữ liệu hơn (ít nhất, nó đã làm dưới runtime di sản - Tôi nghĩ lẽ nó có thể để hỗ trợ subclassing mà không @ interface đầy đủ các siêu nhân kỹ thuật có thể, nhưng có lẽ không hữu ích..)

+0

Hmm, tôi đã tìm càng nhiều. Tuy nhiên, điều đó khiến tôi không chắc chắn nên làm gì ở đây. Tôi cho rằng tuyến đường duy nhất mà tôi còn lại là làm cho siêu lớp công khai và chỉ đơn giản là tài liệu rằng việc sử dụng siêu lớp không được thông báo. – Grimless

+1

Ah, vâng. Một siêu lớp trừu tượng. Tôi khuyên bạn nên đọc về Nhóm lớp vì chúng duy trì một mẫu thiết kế tương tự. – bbum

+0

Thật không may, tôi không tin rằng các cụm lớp giải quyết vấn đề này. Các nhóm lớp ẩn các lớp con cung cấp chức năng cụ thể. Tôi đang cố gắng ẩn * superclass * trong khi vẫn làm cho các lớp con có sẵn công khai. Trong mọi trường hợp, cảm ơn cho cái nhìn sâu sắc! – Grimless

37

Vấn đề là bạn có vòng lặp vô hạn trong #imports của mình. Giải pháp: tất cả #imports đi trong tệp triển khai và tất cả các lớp cần thiết được khai báo trong tệp .h.

1

Tôi gặp sự cố trong đó tôi đang sử dụng các danh mục trong một phương thức siêu lớp và đã nhận được lỗi kế thừa này. Một khi tôi di chuyển các loại .h nhập khẩu vào các tập tin superclass .m bắt đầu nhận được tốt hơn.

6

Tôi có câu trả lời: Bạn phải kiểm tra đơn đặt hàng '#import' của mình. Trước khi bạn sử dụng siêu lớp, nó sẽ được nhập và biên dịch.

1

Chỉ cần thực hiện tất cả các tiêu đề có thể có từ tệp .h đến .m của siêu lớp và xem vấn đề nào là vấn đề. Tôi chắc chắn rằng đó là một trong những tiêu đề phổ biến được sử dụng trong cả hai lớp.

0

Giống như @Igor nói, thứ tự của hàng nhập khẩu các vấn đề:

tôi đã phải thay đổi

#import <KeychainItemWrapper/KeychainItemWrapper.h> 
#import <Foundation/Foundation.h> 

để

#import <Foundation/Foundation.h> 
#import <KeychainItemWrapper/KeychainItemWrapper.h> 
Các vấn đề liên quan