Sự khác biệt giữa khung và thư viện tĩnh trong xcode4 và cách gọi chúng


133

Tôi còn khá mới với xcode và object-c. Tôi muốn hỏi một câu hỏi rất cơ bản.

Tôi thấy rằng khi "liên kết nhị phân với thư viện" trong cài đặt dự án, có sự khác biệt về khung và thư viện, được nhập từ các dự án khác trong không gian làm việc.

Câu hỏi đầu tiên, tại sao có một khuôn khổ? Và tại sao có một thư viện? Không thể thư viện của tôi là một khung?

Và sau đó, từ tệp .h , làm cách nào tôi có thể gọi các lớp từ thư viện tĩnh đã nhập?

Tôi cho rằng phải có tiền tố, nhưng tôi không thể tìm thấy nó. Cả "ProjName / Mygroup.h" đều không hoạt động.

Xin vui lòng, cụ thể như bạn có thể.

Cảm ơn


Không phải là một câu hỏi cơ bản
Masih

Câu trả lời:


140

Ưu điểm lớn nhất mà một khung công tác có được đối với các thư viện tĩnh là chúng hoạt động như một cách gọn gàng để đóng gói nhị phân thư viện đã biên dịch và bất kỳ tiêu đề liên quan nào. Chúng có thể được đưa vào dự án của bạn (giống như các khung dựng sẵn của SDK như Foundation và UIKit) và chúng chỉ nên hoạt động (hầu hết thời gian).

Hầu hết các khung chứa các thư viện động; các khung được tạo trong Xcode bằng mẫu Mac Framework sẽ tạo một thư viện động. IPhone không hỗ trợ các khung động, đó là lý do tại sao nó trở nên phổ biến đối với các thư viện mã iOS có thể tái sử dụng được phân phối dưới dạng thư viện tĩnh thay thế.

Các thư viện tĩnh vẫn ổn, nhưng chúng đòi hỏi một chút công việc phụ từ phía người dùng. Bạn cần liên kết dự án của bạn với thư viện và bạn cần sao chép các tệp tiêu đề vào dự án của bạn hoặc tham chiếu chúng ở đâu đó bằng cách đặt các đường dẫn tìm kiếm tiêu đề phù hợp trong cài đặt bản dựng của bạn.

Vì vậy: tóm lại, ý kiến ​​của tôi là cách tốt nhất để phân phối thư viện của bạn là một khung. Để tạo khung "tĩnh" cho iOS, về cơ bản bạn có thể lấy khung bình thường và thay thế tệp nhị phân bằng thư viện tĩnh đã biên dịch của bạn. Đây là cách tôi phân phối một trong các thư viện của mình, Resty và là cách tôi dự định phân phối các thư viện của mình trong tương lai.

Bạn có thể muốn xem Rakefile được cung cấp trong dự án đó (trong trường hợp bạn không biết, Rake tương đương với Make của Ruby). Tôi có một số nhiệm vụ để biên dịch dự án của mình (sử dụng xcodebuild) và đóng gói chúng dưới dạng khung tĩnh cho iOS. Bạn nên tìm thấy điều này hữu ích.

Ngoài ra, bạn có thể muốn sử dụng các mẫu Xcode 4 này để tạo khung iOS.

Cập nhật ngày 9 tháng 12 năm 2013 : đây là một câu trả lời phổ biến vì vậy tôi nghĩ tôi sẽ chỉnh sửa để nói rằng lựa chọn đầu tiên của tôi cho phân phối thư viện đã thay đổi. Lựa chọn đầu tiên của tôi cho bất kỳ thư viện bên thứ ba nào với tư cách là người tiêu dùng hoặc nhà sản xuất là CocoaPods. Tôi phân phối các thư viện của mình bằng Cốc Cốc và cung cấp một thư viện tĩnh được biên dịch sẵn với các tiêu đề làm tùy chọn dự phòng.


1
Vì vậy, các thư viện có thể là tĩnh và động, và các khung chỉ đơn giản là một nhóm các thư viện, cũng có thể là động hoặc tĩnh, đó có phải là cách hiểu đúng?
Tony

Có vẻ như mục tiêu khung Xcode cũng cho phép bạn sao chép các tiêu đề, nhưng không gói tài nguyên. Thư viện tĩnh phân tán cũng có thể chứa các tiêu đề?
Tony

Câu hỏi tiếp theo: có vấn đề gì không nếu bạn đã xây dựng một khung bằng cách sử dụng Gỡ lỗi hoặc Phân phối? Bởi vì nếu không Phân phối có dấu chân nhỏ hơn.
Aldrich Co

2
@GoRoS có tôi làm; trong thực tế, tôi đã thực hiện một số công việc cho một khách hàng để cung cấp SDK riêng của họ bằng cách sử dụng Cốc Cốc. Mẹo nhỏ là có một repo công khai với thư viện tĩnh được biên dịch, các tiêu đề và podspec chỉ vào điều này và một repo riêng với nguồn của bạn. Lý tưởng nhất là bạn có một số loại CI / tự động hóa để kiểm tra repo riêng của bạn, biên dịch và cập nhật repo công khai của bạn, giữ cho hai đồng bộ hóa. Sử dụng thẻ để gắn thẻ các bản phát hành được phiên bản thực tế trong repo công khai (và có thể trong cả repo riêng để bạn biết cam kết nguồn nào đã được sử dụng để tạo bản phát hành công khai).
Luke Redpath

1
@LukeRedpath giải pháp của bạn với CI nghe có vẻ khá lý tưởng ... bạn có biết về một số bài viết / blog hay với một số hướng dẫn cách thiết lập nó không? Lý tưởng nhất với Jenkins
micromanc3r

19

về cơ bản, các thư viện là các thư viện và cung cấp một cơ chế thuận tiện để làm việc với chúng. Nếu bạn nhìn "bên trong" một khung, thì đó chỉ là một thư mục chứa thư viện tĩnh và các tệp tiêu đề (trong một số cấu trúc thư mục có siêu dữ liệu).

Nếu bạn muốn tạo khung riêng của mình, bạn phải tạo một "thư viện tĩnh" và đóng gói theo cách cụ thể. xem câu hỏi này

Nói chung, framworks trên nền tảng được sử dụng cho hành vi có thể sử dụng lại khi bạn thêm mã của riêng mình "vào một khung hiện có". nếu bạn muốn có một số chức năng cụ thể, bạn có thể muốn sử dụng một thư viện (ví dụ ba20) và đóng gói nó vào ứng dụng của bạn có thể phân phối


1
Lưu ý rằng không có yêu cầu rằng khung phải chứa thư viện tĩnh. Trên thực tế, trên Mac OS X, hầu hết các khung không chứa các thư viện tĩnh - thay vào đó chúng chứa các thư viện động.

cảm ơn rõ ràng, nhưng làm cách nào tôi có thể gọi một lớp trong thư viện tĩnh từ trong tệp .m? Có đủ để gọi #import "MyClass.h", bên cạnh việc thêm vào "liên kết nhị phân với thư viện" không?
Leonardo

@Bavarious bạn đúng tôi chỉ nên viết "thư viện" ^^; Tuy nhiên, có gần như bất kỳ khung nào không có thư viện - trong hầu hết các trường hợp, bạn liên kết với khung để biên dịch và thư viện có mặt trên hệ thống đích. đây lại là điều hành vi so với chức năng
Martin Ullrich

@Leonardo vâng, về cơ bản đó là những gì bạn phải làm. Chỉ cần đảm bảo các tệp .h ở đâu đó trong đường dẫn của bạn. Nếu bạn có dự án XCode của libaray, bạn có thể bao gồm dự án và mục tiêu của nó làm phụ thuộc để bạn có thêm các tính năng gỡ lỗi và các tệp .h trong đường dẫn của bạn
Martin Ullrich

Tôi bối rối, tôi nghĩ câu trả lời của bạn là đúng, nhưng tôi thấy nó được đánh dấu là "-1"?!?!?! Thứ hai, thư viện là một phần của không gian làm việc và được liên kết chính xác từ dự án chính. Nhưng tôi vẫn nhận được "lớp không tìm thấy" tại dòng '#import "MyClass.h"' khi xây dựng ứng dụng. Tôi biết có một mẹo để làm cho nó hoạt động.
Leonardo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.