Perbedaan antara framework dan perpustakaan statis di xcode4, dan bagaimana memanggil mereka

133

Saya cukup baru untuk xcode dan objektif-c. Saya ingin mengajukan pertanyaan yang sangat mendasar.

Saya melihat bahwa ketika "menautkan biner ke perpustakaan" di pengaturan proyek, ada perbedaan tentang kerangka kerja dan perpustakaan, yang diimpor dari proyek lain di ruang kerja.

Pertanyaan pertama, mengapa ada kerangka kerja? Dan mengapa ada perpustakaan? Tidak bisakah perpustakaan saya menjadi kerangka kerja?

Dan kemudian, dari file .h , bagaimana saya bisa memanggil kelas dari perpustakaan statis impor saya?

Saya kira harus ada awalan, tetapi saya tidak dapat menemukannya. Baik "ProjName / Myclass.h" tidak berfungsi.

Tolong, sespesifik mungkin.

Terima kasih

Leonardo
sumber
Bukan pertanyaan mendasar
Masih

Jawaban:

140

Keuntungan terbesar kerangka kerja memiliki lebih dari perpustakaan statis adalah mereka bertindak sebagai cara yang rapi untuk mengemas biner perpustakaan yang dikompilasi dan header terkait lainnya. Mereka dapat dimasukkan ke dalam proyek Anda (seperti kerangka kerja built-in SDK seperti Foundation dan UIKit) dan mereka seharusnya bekerja (sebagian besar waktu).

Sebagian besar kerangka kerja berisi perpustakaan dinamis; kerangka kerja yang dibuat dalam Xcode menggunakan templat Kerangka Mac akan membuat perpustakaan dinamis. IPhone tidak mendukung kerangka kerja dinamis yang menjadi alasannya mengapa perpustakaan yang dapat digunakan kembali dari kode iOS dapat didistribusikan sebagai perpustakaan statis.

Perpustakaan statis baik-baik saja, tetapi mereka membutuhkan sedikit kerja ekstra dari pihak pengguna. Anda perlu menautkan proyek Anda ke perpustakaan dan Anda perlu menyalin file header ke proyek Anda atau referensi mereka di suatu tempat dengan mengatur jalur pencarian header yang sesuai dalam pengaturan build Anda.

Jadi: dalam ringkasan, pendapat saya adalah bahwa cara terbaik untuk mendistribusikan perpustakaan Anda adalah sebagai suatu kerangka kerja. Untuk membuat kerangka "statis" untuk iOS, Anda pada dasarnya dapat mengambil kerangka kerja normal dan mengganti biner dengan pustaka statis terkompilasi Anda. Ini adalah bagaimana saya mendistribusikan salah satu perpustakaan saya, Resty dan bagaimana saya bermaksud untuk mendistribusikan perpustakaan saya di masa depan.

Anda mungkin ingin melihat Rakefile yang disediakan dalam proyek itu (jika Anda tidak sadar, Rake adalah setara dengan Make dari Ruby). Saya memiliki beberapa tugas untuk mengkompilasi proyek saya (menggunakan xcodebuild) dan mengemasnya sebagai kerangka kerja statis untuk iOS. Anda harus menemukan ini berguna.

Atau, Anda mungkin ingin menggunakan templat Xcode 4 ini untuk membuat kerangka kerja iOS.

Pembaruan 9 Des 2013 : ini adalah jawaban yang populer jadi saya pikir saya akan mengedit untuk mengatakan bahwa pilihan pertama saya untuk distribusi perpustakaan telah berubah. Pilihan pertama saya untuk perpustakaan pihak ketiga mana pun sebagai konsumen atau produsen adalah CocoaPods. Saya mendistribusikan perpustakaan saya menggunakan CocoaPods dan menawarkan perpustakaan statis yang sudah dikompilasi dengan header sebagai opsi mundur.

Luke Redpath
sumber
1
Jadi perpustakaan bisa statis dan dinamis, dan kerangka hanyalah sekelompok perpustakaan, yang juga bisa dinamis atau statis, apakah itu pemahaman yang benar?
Tony
Tampaknya target kerangka kerja Xcode juga memungkinkan Anda untuk menyalin tajuk, tetapi tidak membundel sumber daya. Bisakah pustaka statis yang didistribusikan juga mengandung tajuk?
Tony
Pertanyaan tindak lanjut: apakah penting jika Anda telah membangun kerangka kerja baik menggunakan Debug atau Distribusi? Karena sebaliknya Distribusi memiliki jejak yang lebih kecil.
Aldrich Co
2
@ GoRoS ya saya lakukan; sebenarnya saya hanya melakukan beberapa pekerjaan untuk klien membuat SDK pribadi mereka tersedia menggunakan CocoaPods. Kuncinya adalah memiliki repo publik dengan pustaka statis terkompilasi, header dan podspec yang menunjuk ini dan repo pribadi dengan sumber Anda. Idealnya Anda memiliki semacam CI / otomatisasi untuk memeriksa repo pribadi Anda, kompilasi dan perbarui repo publik Anda, menjaga keduanya tetap sinkron. Gunakan tag untuk menandai rilis versi aktual di repo publik (dan mungkin juga di repo pribadi sehingga Anda tahu komit sumber mana yang digunakan untuk membuat rilis publik).
Luke Redpath
1
@LukeRedpath solusi Anda dengan CI terdengar cukup ideal ... apakah Anda tahu tentang beberapa artikel / blog yang bagus dengan beberapa tutorial cara mengaturnya? Idealnya dengan Jenkins
micromanc3r
19

pada dasarnya, kerangka kerja adalah perpustakaan dan menyediakan mekanisme yang berguna untuk bekerja dengannya. Jika Anda melihat "di dalam" kerangka kerja, itu hanya direktori yang berisi pustaka statis dan file header (dalam beberapa struktur folder dengan metadata).

Jika Anda ingin membuat kerangka kerja Anda sendiri, Anda harus membuat "perpustakaan statis" dan mengemasnya dengan cara tertentu. lihat pertanyaan ini

Secara umum, bingkai di platform digunakan untuk perilaku yang dapat digunakan kembali di mana Anda menambahkan kode Anda sendiri "ke dalam kerangka kerja yang ada". jika Anda ingin memiliki beberapa fungsi spesifik, Anda mungkin ingin menggunakan perpustakaan (misalnya three20) dan memasukkannya ke dalam aplikasi Anda yang dapat didistribusikan

Martin Ullrich
sumber
1
Perhatikan bahwa tidak ada persyaratan bahwa kerangka kerja harus mengandung pustaka statis. Bahkan, pada Mac OS X sebagian besar kerangka kerja tidak mengandung pustaka statis - justru berisi pustaka dinamis.
terima kasih sudah jelas, tetapi bagaimana saya bisa memanggil kelas di perpustakaan statis dari dalam file .m? Apakah cukup dengan memanggil #import "MyClass.h", selain menambahkan "tautan binari dengan perpustakaan"?
Leonardo
@Bavarious Anda benar saya seharusnya hanya menulis "libraries" ^^; masih, hampir semua kerangka kerja tanpa pustaka - dalam kebanyakan kasus, Anda menautkan kerangka kerja untuk kompilasi dan pustaka hadir pada sistem target. ini lagi adalah perilaku-vs-fungsionalitas ini
Martin Ullrich
@Leonardo ya, pada dasarnya itulah yang harus Anda lakukan. Pastikan saja file .h ada di jalur Anda. Jika Anda memiliki proyek-XCode dari libaray, Anda dapat memasukkan proyek dan targetnya sebagai dependensi sehingga Anda mendapatkan lebih banyak fitur debugging dan file .h di jalur Anda
Martin Ullrich
Saya bingung, saya kira jawaban Anda benar, tetapi saya melihatnya ditandai sebagai "-1"?!?!?! Kedua, perpustakaan adalah bagian dari ruang kerja, dan terhubung dengan benar dari proyek utama. Tapi saya masih mendapatkan "kelas tidak ditemukan" di baris '#import "MyClass.h"' ketika membangun aplikasi. Saya tahu ada trik untuk membuatnya bekerja.
Leonardo