2012-01-24 45 views
9

Vì vậy, tôi đã thực hiện một số nghiên cứu về vấn đề này, nhưng tôi chưa tìm thấy bất kỳ điều gì tương tự ..."Không thể tìm thấy khai báo giao diện cho NSObject"?

Vì vậy, tôi đang mã hóa một trò chơi trong Obj-C bằng Xcode và Sparrow Framework. Tôi đã làm việc trên giả lập cho đến thời điểm này, và tất cả đều ổn. Nhưng khi tôi chuyển sang chạy nó trên thiết bị của mình, tôi nhận được tất cả các loại lỗi cho những thứ phải là tiêu chuẩn, ví dụ: "Không thể tìm thấy khai báo giao diện cho NSObject", "Tên loại không xác định 'NSMutableArray'" v.v. Tôi đã có #import trong mỗi lớp, vì vậy bạn sẽ nghĩ rằng nó không nên xảy ra, phải không? Tôi có cảm giác rằng nó chỉ là một hoặc hai dòng cần thay đổi ở đâu đó - nhưng tôi không có manh mối gì hay ở đâu.

Nếu có ai có lời khuyên nào, nó sẽ được đánh giá rất nhiều. :)

EDIT: Đây là ảnh chụp màn hình của một trong các tệp .h cung cấp lỗi - có vẻ như chỉ ở một số tệp .h mà tôi đã tạo. http://i.imgur.com/EuQh4.png

+4

Âm thanh như Foundation sẽ không được nhập bằng cách nào đó. Hãy thử thêm '#import ' vào prefix.pch của bạn để xem nó có xóa các cảnh báo hay không. –

+0

Chỉ cần kiểm tra Application_Prefix.pch - nó đã có trong đó, cùng với và "Sparrow.h" O.o –

+1

Là tổ chức được liệt kê trong thư mục khung công tác của bạn? Bạn đang liên kết với nó trong cài đặt mục tiêu của bạn? –

Trả lời

37

Có vẻ như bạn có thể có tham chiếu vòng tròn ở một trong các tệp tiêu đề của bạn.

Điều này có thể xảy ra khi foo.h #imports "bar.h" và bar.h #imports "foo.h" (hoặc đôi khi chuỗi của một trong ba tệp tiêu đề trở lên nhập lẫn nhau trong một vòng kết nối) và dẫn đến các lỗi giả mạo như lỗi bạn đang thấy.

Giải pháp là cố gắng tránh nhập tiêu đề trong tệp .h của bạn và thay vào đó sử dụng tham chiếu @class cho lớp bên ngoài trong tệp .h và đặt #imports trong tệp .m thay thế. Vì vậy, thay vì viết:

#import "SomeClass.h" 

Trong file .h của bạn, bất cứ khi nào có thể đặt:

@class SomeClass; 

Trong file .h của bạn, và đặt câu lệnh #import trong file .m bạn thay thế.

+1

Xin chào, tôi đã thực hiện cú đánh này và có vẻ như đã thực hiện thủ thuật cho hầu hết các lỗi này, cảm ơn bạn! Đó là kỳ lạ, mặc dù tôi đã kiểm tra tài liệu tham khảo vòng tròn và dường như không có bất kỳ thứ gì tôi có thể thấy ... Ngoài ra, dường như vẫn còn một số ít (chúng tôi đã giảm từ 20 lỗi xuống còn 5), nhưng tôi sẽ giữ nó. Cảm ơn một lần nữa :) –

4

Thử xóa dữ liệu có nguồn gốc cho dự án. Bạn có thể làm điều đó thông qua người tổ chức, theo dự án. Bạn có thể có một tiêu đề biên dịch bị hỏng.

+0

Chỉ cần thử nó, mặc dù nó sẽ không cho phép tôi xóa bất kỳ dữ liệu có nguồn gốc nào. Nút có màu xám, vì vậy tôi đoán không có gì ở đó ngay từ đầu? –

+1

Ok, đó có thể không phải là sau đó, nhưng chỉ trong trường hợp, đi đến '/ Users//Library/Developer/Xcode/DerivedData' và tìm thư mục dự án và xóa nó. Nó an toàn để xóa tất cả các thư mục ở đây nếu bạn không chắc chắn cái nào là đúng, Xcode sẽ chỉ phải reindex các tệp nguồn của bạn. – joerick

+0

Đã đi kiểm tra xem nó ra, nhưng không có dữ liệu trong đó để bắt đầu. Đó là một chút bí ẩn! –

0

Đảm bảo rằng bạn không sử dụng Tên lớp đã được sử dụng. Tôi đã có cùng một vấn đề khi tôi đặt tên một trong các lớp học của tôi "tín hiệu", mà đã là một phần của Foundation.

64

Điều này có thể do không bao gồm UIKit.

Thêm phần này vào tiêu đề của bạn:

#include <UIKit/UIKit.h> 

Ngoài ra hãy chắc chắn để thêm khung UIKit để dự án của bạn. (Mục tiêu/Xây dựng giai đoạn/Liên kết nhị phân với thư viện/- Chọn Thêm --- Thêm UIKit.Framework)

+2

Có vẻ như Xcode mới không bao gồm khung UIKit theo mặc định. –

+2

Điều này rất quan trọng đối với Xcode 6 và iOS 8+ SDK. – Danoli3

+0

bạn tiết kiệm thời gian của tôi cảm ơn rất nhiều;) – mychar

7

Hãy thử thay vì ứng dụng Cocoa hoặc iOS, hãy đảm bảo nhập "Foundation/Foundation.h" trong lớp học của bạn nơi bạn đang kế thừa lớp NSObject.

0

Cũng đảm bảo bạn không bao gồm tệp mục tiêu-C từ tệp .cpp hoặc .c.

Ví dụ: PhotoManager.mm có thể bao gồm tệp tiêu đề từ cặp Objective-C PhotoObject.h/PhotoObject.mm. Sau đó, nếu MyAwesomeCppFile.cpp bao gồm PhotoManager.h, đột nhiên PhotoObject.h không biết các lớp và từ khóa Mục tiêu-C cơ bản.

Một giải pháp sẽ là sử dụng #ifdef __OBJC__ nếu bạn có thể thoát khỏi nó.

Nếu không chỉ định loại .cpp tập tin như Objective-C++ Source trong bảng thuộc tính của tập tin (điều khiển cửa sổ trên bên phải => "Identity và gõ")

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