Xcode4'teki çerçeve ve statik kitaplık arasındaki fark ve nasıl çağrılacağı


133

Ben xcode ve objektif-c için oldukça yeniyim. Çok temel bir soru sormak istiyorum.

Proje ayarlarında "ikili dosyayı kütüphanelere bağlarken", çalışma alanındaki diğer projelerden içe aktarılan çerçeve ve kütüphaneler hakkında farklılıklar olduğunu gördüm.

İlk soru, neden bir çerçeve var? Ve neden bir kütüphane var? Kütüphanem bir çerçeve olamaz mı?

Ve sonra, bir .h dosyasından, içe aktarılan statik kitaplığımdan sınıfları nasıl çağırabilirim?

Sanırım bir önek olmalı, ama bulamadım. Ne "ProjName / Myclass.h" çalışmıyor.

Lütfen olabildiğince spesifik olun.

Teşekkürler


Temel bir soru değil
Masih

Yanıtlar:


140

Bir çerçevenin statik kütüphanelere göre en büyük avantajı, derlenmiş kütüphane ikili dosyasını ve ilgili başlıkları paketlemenin düzgün bir yolu olarak hareket etmeleridir. Projenize bırakılabilirler (tıpkı SDK'nın Vakıf ve UIKit gibi yerleşik çerçeveleri gibi) ve sadece çalışmalıdırlar (çoğu zaman).

Çoğu çerçeve dinamik kütüphaneler içerir; Mac Framework şablonu kullanılarak Xcode'da oluşturulan çerçeveler dinamik bir kütüphane oluşturur. İPhone dinamik çerçeveleri desteklemiyor, bu yüzden iOS kodunun yeniden kullanılabilir kitaplıklarının statik kitaplıklar olarak dağıtılması yaygınlaştı.

Statik kütüphaneler iyidir, ancak kullanıcının biraz fazladan çalışması gerekir. Projenizi kütüphaneye bağlamanız ve üstbilgi dosyalarını projenize kopyalamanız veya derleme ayarlarınızda uygun üstbilgi arama yollarını ayarlayarak bir yere başvurmanız gerekir .

Özetle, bence kitaplığınızı dağıtmanın en iyi yolu bir çerçeve. İOS için "statik" bir çerçeve oluşturmak için, normalde normal bir çerçeve alabilir ve ikili dosyayı derlenmiş statik kitaplığınızla değiştirebilirsiniz. Kütüphanelerimden biri olan Resty'yi bu şekilde dağıtırım ve gelecekte kütüphanelerimi bu şekilde dağıtmayı planlıyorum.

Bu projede sağlanan Rakefile'a bakmak isteyebilirsiniz (farkında değilseniz, Rake, Ruby'nin Make eşdeğeridir). Projemi derlemek (kullanmak xcodebuild) ve iOS için statik bir çerçeve olarak paketlemek için birkaç görevim var . Bunu faydalı bulmalısınız.

Alternatif olarak, bu Xcode 4 şablonlarını bir iOS çerçevesi oluşturmak için kullanmak isteyebilirsiniz .

Güncelleme 9 Aralık 2013 : Bu popüler bir cevap, bu yüzden kütüphane dağıtımı için ilk tercihimin değiştiğini söylemek için düzenleme yapacağımı düşündüm. Tüketici ya da üretici olarak herhangi bir üçüncü taraf kütüphanesi için ilk tercihim CocoaPods. Kütüphanelerimi CocoaPods kullanarak dağıtıyorum ve bir yedek seçenek olarak üstbilgileri olan önceden derlenmiş statik bir kitaplık sunuyoruz.


1
Kütüphaneler statik ve dinamik olabilir ve çerçeveler basitçe dinamik veya statik olabilen bir grup kütüphanedir, doğru mu?
Tony

Görünüşe göre Xcode çerçeve hedefi de başlıkları kopyalamanıza izin veriyor ancak kaynakları paketlemiyor. Dağıtılmış statik kitaplıklar da üstbilgiler içerebilir mi?
Tony

Takip eden soru: Hata Ayıklama veya Dağıtım kullanarak bir çerçeve oluşturup oluşturmadığınız önemli mi? Aksi halde Dağıtım daha az yer kaplar.
Aldrich Co

2
@ GORoS evet yapıyorum; Aslında ben sadece özel SDK CocoaPods kullanarak kullanılabilir hale bir istemci için bazı işler yaptım. İşin püf noktası derlenmiş statik kitaplık, başlıklar ve podspec ile bunu gösteren genel bir repo ve kaynağınızla özel bir repo sahip olmaktır. İdeal olarak, özel repolarınızı kontrol etmek, genel repounuzu derlemek ve güncellemek için bir çeşit CI / otomasyonunuz olacaktır. Genel repodaki (ve muhtemelen özel repo'daki gerçek sürümleri etiketlemek için etiketleri kullanın, böylece genel sürümü oluşturmak için hangi kaynak taahhüdünün kullanıldığını bilirsiniz).
Luke Redpath

1
@LukeRedpath CI ile çözüm oldukça ideal geliyor ... nasıl kurmak bazı öğretici ile bazı iyi makale / blog hakkında biliyor musunuz? İdeal olarak Jenkins
micromanc3r ile

19

temel olarak, çerçeveler kütüphanelerdir ve onlarla çalışmak için kullanışlı bir mekanizma sağlarlar. Bir çerçevenin "içine" bakarsanız, bu yalnızca statik bir kütüphane ve başlık dosyaları (meta veri içeren bazı klasör yapısında) içeren bir dizindir.

Kendi çerçevenizi oluşturmak istiyorsanız, bir "statik kütüphane" oluşturmanız ve onu belirli bir şekilde paketlemeniz gerekir. bkz bu soruyu

Genel olarak, platformlardaki çerçeveler, kendi kodunuzu "mevcut bir çerçeveye" eklediğiniz yeniden kullanılabilir davranış için kullanılır. belirli bir işlevselliğe sahip olmak istiyorsanız, bir kütüphane (örn. three20) kullanmak ve onu dağıtılabilir uygulamanıza paketlemek isteyebilirsiniz


1
Bir çerçevenin statik kitaplık içermesi gerekmediğini unutmayın. Aslında, Mac OS X'te çoğu çerçeve statik kitaplıklar içermez - bunun yerine dinamik kitaplıklar içerir.

teşekkürler açıktır, ancak statik bir kitaplıktaki bir sınıfı bir .m dosyasından nasıl çağırabilirim? "İkilileri kütüphanelere bağla" nın yanı sıra #import "MyClass.h" ifadesini çağırmak yeterli mi?
Leonardo

@ Haklı haklısın sadece "kütüphaneler" yazmalıydım ^^; yine de, kütüphanesiz neredeyse her çerçeve vardır - çoğu durumda, derleme için bir çerçeveye bağlanırsınız ve kütüphane hedef sistemde bulunur. yine bu davranış-işlevsellik olayı
Martin Ullrich

@Leonardo evet, temelde yapmanız gereken bu. Sadece .h dosyalarının yolunuzda bir yerde olduğundan emin olun. Libaray'ın XCode projesine sahipseniz, projeyi ve hedefini bağımlılık olarak dahil edebilirsiniz, böylece yolunuzda daha fazla hata ayıklama özelliği ve .h dosyaları elde edebilirsiniz
Martin Ullrich

Kafam karıştı, cevabınızın doğru olduğunu düşündüm, ama "-1"?!?!?! İkincisi, kütüphane bir çalışma alanının parçasıdır ve ana projeden doğru şekilde bağlanmıştır. Ama hala uygulama oluştururken "#import" MyClass.h "'satırında" sınıf bulunamadı "alıyorum. Çalışmasını sağlamak için bir hile olduğunu biliyorum.
Leonardo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.