SORU
2 NİSAN 2010, Cuma


Objective-C kategorileri statik kitaplığı

Düzgün statik kütüphane projesi iphone için bağlantı nasıl bana rehberlik eder. Kullandığım staic kütüphane doğrudan bağımlılık app projeye eklenen proje (- ^hedef . genel ->dependecies doğrudan) ve TAMAM çalışır, ama kategoriler. Kategori statik kütüphane içinde tanımlı uygulama çalışmıyor.

Benim sorum başka bir projeye bazı kategoriler ile statik kütüphane eklemek için nasıl?

Ve genel olarak en iyisi, diğer projelerin Uygulama Projesi kod olarak kullanmak için bir uygulamadır?

CEVAP
10 NİSAN 2010, CUMARTESİ


Çözüm:Olarak böyle büyük mükafat 4.2 yapmaniz gereken gitmek için bir uygulama bağlama karşı kütüphane (kitaplık) ve ardından proje Gezgini, uygulamanızın hedef derleme ayarlarını, arama için "Other Linker Flags" düğmesini tıklayın ve Ekle '-ObjC'. -all_load '' ve '-force_load' artık gerekli.

Ayrıntılar: Çeşitli forumlar, bloglar ve dokümanlar apple hakkında bazı cevaplar buldum. Şimdi arar ve deneylerimi kısa özetini yapmak çalışıyorum.

Sorun (&QA1490 http://developer.apple.com/mac/library/qa/qa2006/qa1490.html) apple Teknik Q dan alıntı neden oldu:

Objective-C linker tanımlamıyor her bir fonksiyon (ya da yöntem,için semboller Objective-C) - bunun yerine, linker semboller, sadece her biri için oluşturulur sınıf. Eğer önceden varolan bir genişletmek kategoriler ile sınıf, linker mu edinme nesne kodunu bilmek temel sınıf uygulaması ve kategori uygulanması. Bu nesneleri oluşturulan engeller yanıt kaynaklanan uygulama için tanımlanan bir seçici kategori.

Ve onların çözüm:

Bu sorunu gidermek için statik kütüphane-ObjC seçeneği geçmelidir linker için. Bu bayrak neden olur her nesne yüklemek için linker dosyasını bir tanımlayan kitaplığı Objective-C sınıf veya kategori. Süre bu seçenek genellikle bir neden olacaktır büyük çalıştırılabilir (nedeniyle ek için nesne kod yüklenen uygulama, izin verir etkili başarılı oluşturma Objective-C statik kitaplıkları mevcut kategoriler içerir sınıflar.

ve ayrıca iPhone Geliştirme SSS öneri var:

Nasıl Objective-C tüm bağlantı verebilirim statik bir kütüphane sınıfları? Set Diğer Linker Flags ayarını inşa -ObjC.

ve bayrakları açıklamaları:

-all_loadYükler statik arşiv kütüphaneler tüm üyeleri.

-ObjCYükler bir uygulayan statik arşiv kütüphaneler tüm üyeleri Objective-C sınıf veya kategori.

-force_load (path_to_archive)Yükler statik belirtilen tüm üyeleri arşiv Kütüphanesi. Not: -all_load tüm arşivler tüm üyeleri için zorlar yüklenecek. Bu seçenek sağlar belirli bir arşivi hedef.

force_load app ikili boyutunu ve çatışmaları önlemek için kullanabiliriz *wich all_load bazı durumlarda neden olabilir.

Evet, *ile çalışır.bir dosya projeye eklenir. Henüz doğrudan bağımlılık ilave olarak lib proje ile problem yaşadım. Ama daha sonra bunun benim hatam olduğunu farkettim doğrudan bağımlılık projecct muhtemelen düzgün eklenmedi. Ben kaldırın ve tekrar adımlarla eklemek için:

  1. Sürükle ve bırak proje uygulama proje dosyası (Proje veya add->lib Proje...) ekleyin.
  2. Lib proje simge - mylib ok tıklayın.dosya adı gösterilir, bu mylib sürükleyin.dosya ve Hedef haline bırak ->Kütüphane grubu İle İkili bağlantı.
  3. Açık hedef yumruk sayfasında (Genel) bilgi ve bağımlılıkları için benim lib listenize ekleyin

bundan sonra her şey iyi çalışıyor. "-ObjC" bayrak benim durumumda yeterli.

Ben de http://iphonedevelopmentexperiences.blogspot.com/2010/03/categories-in-static-library.html blog fikri ile ilgileniyordu. Yazar-all_load ya-ObjC bayrak ayarlamadan lib kategoriye kullanın " dedi. O sadece h/m dosyaları boş bir kukla sınıf interface/uygulama linker kullanın Bu dosya zorlamak için kategori Ekle. Ve evet, bu hüner işi.

Ama yazar da o bile değil kukla nesne örneği " dedi. Açıkça bazı aramalıyız buldum Gibi Mm... "" kategori dosyası. kod gerçek En azından sınıf işlevi çağrılmalıdır. Ve biz bile değil, bir kukla sınıf lazım. Tek c işlev aynı.

Eğer öyleyse yazsak lib dosyaları:

// mylib.h
void useMyLib();

@interface NSObject (Logger)
-(void)logSelf;
@end


// mylib.m
void useMyLib(){
    NSLog(@"do nothing, just for make mylib linked");
}


@implementation NSObject (Logger)
-(void)logSelf{
    NSLog(@"self is:%@", [self description]);
}
@end

ve eğer useMyLib ararsak(); her yerde Uygulama Projesi herhangi bir sınıfta logSelf kategori yöntem kullanabiliriz;

[self logSelf];

Ve daha fazla tema ile ilgili bloglar:

http://t-machine.org/index.php/2009/10/13/how-to-make-an-iphone-static-library-part-1/

http://blog.costan.us/2009/12/fat-iphone-static-libraries-device-and.html

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • gadgetgal38

    gadgetgal38

    9 HAZİRAN 2009
  • metagamers

    metagamers

    13 Mayıs 2006
  • Whizzpopping

    Whizzpopping

    10 Kasım 2005