Kütüphane? Statik? Dinamik? Veya Çerçeve? Başka bir projenin içindeki proje


151

Mevcut bir iOS uygulamam var ve sadece test kolaylığı için başka bir proje olarak geliştirdiğim büyük bir kod parçası eklemek istiyorum. Yeni yığın temelde çeşitli paylaşım hizmetlerine, vb bir görüntü kaydetme ile ilgilenir. Bu paylaşım kodu çok fazla test ve gelecekteki güncellemeye ihtiyaç duyduğu için, bu kod yığınını mevcut uygulamama dahil etmenin en iyi yolunun ne olduğunu merak ediyordum.

Statik bir kütüphane mi, dinamik bir kütüphane mi yoksa bir çerçeve mi olmalı bilmiyorum ve dürüst olmak gerekirse, farkın ne olduğundan ya da bununla ilgili olarak Xcode'da nasıl ayarlanacağından emin değilim.

Bildiğim tek şey, paylaşım kodu için ayrı bir test ve güncelleme uygulaması tutmak ve ana uygulamanın kullanmasını istiyorum.


'Çerçeve içindeki çerçeve' gibi bir şemsiye çerçevesi oluşturabilirsiniz stackoverflow.com/a/27638841/1582217
Mohd Iftekhar Qurashi

Yanıtlar:


204

İlk olarak, bazı genel tanımlar (iOS'a özgü):

Statik kütüphane - derleme zamanında bağlı olan ve değişmeyen bir kod birimi.

Ancak, iOS statik kütüphaneler vardır değil görüntüleri / varlıkları (sadece kodu) içermesine izin. Yine de bir medya paketi kullanarak bu zorluğu aşabilirsiniz .

Wikipedia'da daha iyi, daha resmi bir tanım burada bulunabilir .

Dinamik kütüphane - zamanında bağlantılı kod ve / veya varlıkların bir birim olabilir değiştirin.

Ancak, yalnızca Apple'ın iOS için dinamik kitaplıklar oluşturmasına izin verilir. Uygulamanızı reddedeceğinden bunları oluşturma izniniz yok. ( Bu konuda onay ve muhakeme için diğer SO yazısına bakın ).

Yazılım Çerçevesi - bir görevi gerçekleştiren derlenmiş bir kod kümesi ... dolayısıyla, statik bir çerçeve veya dinamik bir çerçeveye sahip olabilirsiniz .

Daha fazla bilgi için Yazılım Çerçevesinde Wiki'ye bakın.

Bu nedenle iOS'ta tek seçeneğiniz temel olarak statik bir kütüphane veya statik çerçeve kullanmaktır (temel fark, statik çerçevenin .aen sık derlenmiş bir dosya olarak dağıtılmasıdır , oysa statik bir kütüphane sadece bir alt proje olarak dahil edilebilir - görebilirsiniz. kodun tamamı - ilk olarak derlenir ve sonuç .adosyası proje tarafından bağımlılık olarak kullanılır).

Artık bu terimler konusunda net olduğumuza göre, statik bir kütüphane kurmak ve iOS için medya paketini desteklemek çok zor değil ve bunun nasıl yapılacağı konusunda birçok öğretici var. Şahsen bunu tavsiye ederim:

https://github.com/jverkoey/iOS-Framework

Bu oldukça basit bir kılavuzdur ve "sahte statik kütüphaneler" ile uğraşmanın dezavantajı yoktur ... daha fazla bilgi için göz atın ...

Statik kitaplığınızı oluşturduktan sonra, farklı projelerde kullanmak için Git'e bir alt modül eklemek kadar kolaydır .

İyi şanslar.

DÜZENLE

Bir projedeki bir alt proje ile ilgili olarak, bildiğim kadarıyla, bunun doğru bir şekilde çalışmasını / derlenmesini sağlamak için, esas olarak alt projenin önce derlendiği bir derleme zinciri ayarlamanız gerekir, bu .ada bağımlılık olarak kullanılan statik bir çerçeve dosyası oluşturur proje tarafından.

İşte bunun hakkında konuşan başka bir yararlı öğretici:

http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/

DÜZENLEME 2

İOS 8'den itibaren Apple şimdi geliştiricilerin dinamik çerçeveler oluşturmalarına izin veriyor! (Not: Dinamik bir çerçeve eklemek için uygulamanızın minimum iOS 8 hedefi olması gerekir ... geri taşımaya izin verilmez.)

Bu yeni bir proje şablonu olarak eklendi. Xcode 6.1'de, bu adreste bulunabilir:

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework

Şimdiye kadar, alt proje istediğim gibi görünüyor ve bu makale mükemmeldi. Tek bir yan etki fark ettim: Ana projemin içine sürüklediğim alt proje de test koduma (viewcontroller ve nib, appdelegate, vb.) Sahip ve sadece kullanmak istediğim sınıfların ana proje statik kütüphanede kullanılmak üzere kontrol edilir. Ancak bir nedenden dolayı, ana projemin uç dosyasına ek yapmaya gittiğimde, alt projemden çıkışlar ve eylemler de gösterdi. Bu kesinlikle biraz karışıklığa yol açabilir. Onlardan kurtulmak için ipucu var mı? Teşekkürler!
Mart'ta pizzafilmler

Dinamik bir proje statik bir projeye sürüklenip bırakılabilir ve böylece onu statik bir proje haline getirebilir mi? Gerçekten kafam karıştı, bazı açıklamalar gerçekten harika olurdu! Şimdiden teşekkürler :-)
Ravindranath Akila

1
@ JRG-Developer Bazı kurallara
uyursanız

Daha düşük bir minimum hedef belirlemek ve kütüphaneyi isteğe bağlı hale getirmek mümkün mü?
kukudas

1. statik kütüphane, dinamik kütüphane, çerçeve bazı iyi bilinen örnekleri dahil edebilir misiniz? 2. Nerede yapmanız gerektiğine dair örnekler verebilir misiniz? 3. Bir bakla ile bir kütüphane arasındaki fark nedir?
Bal

30

Mach-O dosya biçimi (Mach Nesnesi - .o)

İOS dünyasında her kaynak dosya nesne dosyalarına dönüştürülür - ABI [Hakkında] Mach-O dosyası [Hakkında] , son bir yürütülebilir pakete (örn. Uygulama, çerçeve ...), dosyaya (örn. Kütüphane ...) ve davranışı [Hakkında] tarafından belirlenirMach-O type

Packagekendisini bir dosya olarak gören bir dizindir opaque file. Kullanıcı deneyiminin , öngörülemeyen program davranışına neden olabilecek iç yapıda bazı değişiklikler yapmayı zorlaştırması için yaratılmıştır . Paket, içinde Document Packageveya ile kullanılır Bundle. Show Package ContentsFinder'da kullanabilirsiniz

Bundleikili kod (yürütülebilir kod) ve bu kod için kaynakları (ör. resimler, uçlar ...) düzenlemek için belirli bir yapıya sahip bir dizindir. Paket Info.plist[Hakkında] dosyası içerir . Paket geliştirici deneyimi için oluşturuldu . Ayrıca paketlenebilir. Birkaç paket türü vardır:

  • application bundle - Application target
  • framework bundleve versioned bundlebir alt tür olarak -Framework Target
  • loadable bundle(aka plug-in bundle) - Bundle target(Kullanıcı Arayüzü Test Paketi, Birim Test Paketi)
  • diğerleri ( dSYM[Hakkında] paketi)

Application- .ipa, .app[Hakkında] - packaged application bundle- yıkanabilir program.

Tests- packaged loadable bundlebir ikili testi test etmek için kullanılır. Eklenti mimarisi, mevcut ikili dosyaya ayrı bir modül olarak yeni bir işlev (test senaryoları) eklememizi sağlar

Kütüphaneler ve Çerçeveler

InversionOfControl için Martin Fowler

Bir Kütüphane aslında arayabileceğiniz bir dizi işlevdir, bu günlerde genellikle sınıflar halinde düzenlenmiştir. Her çağrı bir iş yapar ve kontrolü istemciye döndürür.

Bir Çerçeve, içinde daha fazla davranış bulunan bazı soyut tasarımları içerir. Bunu kullanmak için, davranışınızı alt sınıflandırma veya kendi sınıflarınızı takarak çerçevedeki çeşitli yerlere eklemeniz gerekir. Daha sonra çerçevenin kodu bu noktalarda kodunuzu çağırır. Programın ana kontrolü ters çevrilir, sizden çerçeveye taşınır. (Kontrolün Ters Çevrilmesi)

İOS'ta Kitaplıklar ve Çerçeveler

LibraryMach-O nesne dosyalarının bir koleksiyon [çek statik veya dinamik] Bir veya daha fazla mimarileri için derlenmiş.

Static library- .a(diğer adıyla statik arşiv kitaplığı, statik bağlantılı paylaşılan kitaplık [doc] ) - Uygulamanıza eklediğinizde, derleme süresi boyunca statik bağlayıcı , nesne dosyalarını kitaplıktan birleştirir ve uygulama nesnesi dosyalarıyla birlikte tek bir yürütülebilir dosyaya paketler dosya. Dezavantajı büyük bir çıktı dosyasıdır

Xcode 9.0'dan Swift statik kitaplığı desteklenir.

Dynamic library- .dylib(dinamik paylaşılan kitaplık, paylaşılan nesne, dinamik olarak bağlı kitaplık [doc] olarak da bilinir ), uygulamanın yükleme veya çalışma zamanında çalıştırılabilirine dinamik olarak bağlanır , ancak kopyalanmaz. Uygulamada uygulamanın paketi dosya içeren Frameworks klasörünü içerecektir . Tüm iOS ve macOS sistem kütüphaneleri . Dezavantaj, tüm dinamik kütüphanelerin kopyalanması ve bağlanması gerektiğinden yavaş bir başlatma süresidir..dylibdynamic

[Statik ve dinamik bağlantı]

Text-based stub library- .tbd[Hakkında] , dynamic libraryhedef cihazda bulunan bir metin saplamasıdır . Sonuç olarak, dinamik bir kütüphaneyi paketinize paketlememelisiniz. Boyut etkisi vardır.

Frameworkaka binary framework- .frameworkbir not packaged framework bundlederlenmiş içeren (geliştiriciler kolayca başlıkları ve kaynaklara bakmak sağlamak için) static or dynamickütüphane başlık dosyaları ve kaynakları.

Static frameworkstatic librarykaynakları ile birlikte bir paket içerir .

Dynamic frameworkdynamic libraryve kaynaklarını içerir . Buna ek olarak, dinamik çerçeve aynı dinamik kitaplığın farklı sürümlerini tek bir pakette ( versioned bundle) içerebilir

[Statik ve dinamik çerçeve]

Embedded frameworkdynamic frameworkuygulamanın sanal alanında yaşayan bir . Bu tür, öncelikle ortak kod ve kaynakları paylaşacak eklenti için oluşturuldu . Dağıtım hedefi iOS 8+ olduğunda kullanılabilir.

Umbrella framework [Toplam hedef] diğer çerçeveleri içeren bir çerçevedir. İOS'ta resmi olarak desteklenmemektedir ve bu nedenlegeliştiricilerin bunları oluşturmaları önerilmez [Resmi belge] . Gerçekte bu bir alt çerçeve kümesidir (veya İç İçe Çerçeveler). Bağımlılığı olan bir çerçeve oluşturduğunuzda, bir bağımlılık (bir uygulama gibi), bu bağımlılığı çerçevenizle birlikte projeye eklemekten sorumludur. Bir geliştirici olarak, bu görevi tüketiciden sizinkine aktarmanın bir yolunu bulmaya çalışmak doğaldır. Sonuç olarak bununUmbrella frameworkkurtarmaolduğunu düşünüyorsunuz,ancak genellikle sürümleri yönetme ve onu oluşturma ve destekleme karmaşıklığı ile ciddi sorunlara yol açıyor.

Fake Framework-, a olarak davranacak uzantıya sahip static librarybir paket oluşturmak için a altındaki belirli işlemlerin bir sonucudur . Bu teknik, Xcode bir çerçeve şablonuna sahip olmadığından bir çerçeve oluşturmayı desteklemediğinde kullanıldı. Sahte bir çerçevenin gerçekleştirilmesinden biri . Xcode 6 ile Apple, iOS çerçeve desteği ekledi..frameworkdynamic framework

Modular Framework[Hakkında] -içinde@importbir.modulemapdosya bulunanbir çerçevedir. Modül alt modüller içerebilir. Başlıca avantajı, bir inşa süresi kazanmanızdırModular Framework.

Universal Library or Framework(diğer adıyla Fat) [lipo] [Toplam hedef] çoklu mimariler içeriyor. Örneğin, sürüm derlemeniz [ONLY_ACTIVE_ARCH] aracılığıyla düzenleyebileceğiniz bir kemeri desteklemelidir.Build Active Architecture Only

Dependency[Hakkında] Hedefinizin bir parçası olarak üçüncü taraf kodunu kullanabilirsiniz. Başka bir proje, aynı çalışma alanındaki proje, başka bir hedef, kütüphane, çerçeve vb.Gibi birçok kaynaktan gelen bir kodu yeniden kullanmanızı sağlar.

Statik Kitaplık nasıl oluşturulur ve kullanılır:

Dinamik Çerçeve nasıl oluşturulur ve kullanılır [statik olarak değiştir]

[Xcode Derleme Sistemi]
[Xcode bileşenleri]
[Dinamik bağlayıcı]


1
Birçok Swift dersinde , Objective C'nin hızlı desteklediği gibi [ altexsoft.com/blog/engineering/… ] dinamik kütüphaneleri desteklemediğinden bahsediyor , ancak bildiğim kadarıyla OS8, Objctive C Dinamik kütüphaneyi destekliyor. Bunu açıklığa kavuşturabilir misiniz?
pratima

@pratima, iOS için Objective-C üzerinde dinamik bir çerçeve oluşturabilirsiniz
yoAlex5

1
"Statik çerçeve, kaynakları ile paketlenmiş statik bir kütüphane içerir." Bu tanım nereden geldi? Statik çerçevenin "Paket Kaynaklarını Kopyala" oluşturma aşaması AFAK, tıpkı statik kütüphane gibi çalışmaz. Statik çerçeve ile statik kütüphane arasındaki fark nedir?
toshi0383

@ toshi0383 Statik kitaplığı (.a) ve kaynaklarını (.bundle) tüketiciye dağıtabileceğimiz tek bir çerçevede birleştirmenin bir yolunu buldunuz mu?
user121095

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.