2012-05-04 26 views
12

Tôi đang sử dụng một số phần mềm của bên thứ ba để hỗ trợ viết ứng dụng iPad bằng Xcode 4.3.2. Phần mềm này là mã nguồn mở và thường được thiết lập để mã của nó sẽ được biên dịch cùng với bất kỳ mã nào mà nhà phát triển viết cho ứng dụng. Bởi vì tôi đã sử dụng phần mềm ở nhiều nơi, tôi quyết định xây dựng nó như một thư viện tĩnh cho trình mô phỏng iOS.Phương pháp danh mục chọn cuộc gọi không được nhận dạng trong thư viện iOS tĩnh

Tôi có thể xây dựng thư viện và chuyển đổi một ứng dụng để liên kết đến thư viện đó thay vì biên dịch mã nguồn gốc. Tuy nhiên, khi tôi chạy ứng dụng trên trình giả lập, tôi nhận được thông báo lỗi, bộ chọn không được nhận dạng được gửi đến ví dụ.

Tôi đã xác minh rằng chương trình đang sử dụng thành công các phần của thư viện tĩnh. Tuy nhiên, có một đoạn mã cố gắng gọi một phương thức trên một đối tượng, và nơi xảy ra lỗi. Phương thức được gọi là không thực sự được định nghĩa trong giao diện của đối tượng đó. Thay vào đó nó được cung cấp trong một mô-đun bổ sung định nghĩa một thể loại cho lớp của đối tượng đó. Các tập tin tiêu đề cho mô-đun đó được bao gồm đúng và trình biên dịch nên đã có thể tìm thấy phương pháp thể loại và áp dụng nó cho đối tượng, nhưng tại thời gian chạy, lỗi đã đề cập ở trên xảy ra.

Tôi đã sử dụng lệnh 'nm' để xác minh rằng phương thức danh mục tồn tại trong thư viện tĩnh. Dưới đây là ví dụ về đầu ra:

nm libStaticLibrary.a | grep categoryMethod 
00000130 t -[SomeClass(Category) categoryMethod:] 
0000354c s -[SomeClass(Category) categoryMethod:].eh 

Mọi người có ý tưởng gì về cách thư viện này hoạt động chính xác với ứng dụng mong muốn?

+3

Thêm -ObjC cờ mối liên kết như đã giải thích ở đây: http: // stackoverflow .com/questions/2567498/objective-c-categories-in-static-library –

+0

-load_all cũng hoạt động. – CodaFi

+0

có thể trùng lặp của [danh mục liên kết mục tiêu c trong thư viện tĩnh] (http://stackoverflow.com/questions/6820778/linking-objective-c-categories-in-a-static-library) –

Trả lời

24

Khuôn khổ bên thứ ba của bạn có thể xảy ra bằng cách sử dụng danh mục trên lớp (apple) hiện có. Nhưng để nạp/tìm danh mục bạn cần phải thêm -ObjC cờ trong các thiết lập xây dựng dưới Other Linker Flags

buildsettings

+1

Inlcude -Objc như một lá cờ liên kết đã làm các trick. Cảm ơn. –

+2

Điều này phải được đặt trong cài đặt trình liên kết cho mục tiêu sử dụng thư viện, chứ không phải trong chính thư viện. – Krejko

+1

Hãy nhớ rằng đó là -ObjC và không phải -Objc –

3

Pfitz câu trả lời là rất tốt, nhưng điều này sẽ gây ra trình biên dịch để tải một loạt các tập tin nhị phân không sử dụng để dự án của bạn đó không phải là những gì bạn muốn. Vui lòng tham khảo câu trả lời này để biết tại sao https://stackoverflow.com/a/22264650/1363997

Dưới đây là giải pháp tốt nhất:

1) chọn dự án mục tiêu của bạn từ bảng điều khiển bên trái (các thư mục navigator)
2) chọn "Xây dựng giai đoạn" tap
3) mở rộng "Compile Nguồn" tế bào
4) nhấn nút dấu cộng ở phía dưới và sau đó thêm tập tin .m của thể loại của bạn

Xong!

Lưu ý: bạn phải tìm kiếm các tập tin bằng cách điều hướng thông qua các thư mục bằng cách tự của bạn, đừng gõ tên của tập tin vào trường tìm kiếm

+1

Điều này không chỉ sao chép một cách hiệu quả tệp .m vào dự án, đánh bại điểm đóng gói mã trong một thư viện tĩnh ngay từ đầu? – devios1

+0

Tôi đã có cờ -ObjC và -load_all cũng không giải quyết được vấn đề. Điều này đã làm. Cảm ơn. –

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