SORU
10 Kasım 2012, CUMARTESİ


NSObject yüklenip - Ne yapıyorlar?

Bu şartlar geliştirici başlatmak veya yük geçersiz kılmak için öncü anlayış ile ilgileniyorum. Belgeleri bu yöntemler Objective-C çalışma zamanı tarafından çağrılır açıkça ortaya koyuyor, ama bu gerçekten bu yöntemlerin belgeleri açıktır. :-)

Benim merak Apple'ın örnek kod bakarak - MVCNetworking geliyor. Model sınıfı (void) applicationStartup bir yöntemi vardır. Dosya sistemi, NSDefaults, vs vs okur biraz temizlik yapar... ve NSObject sınıfı yöntemleri grok için denedikten sonra, bu bakım işleri yük koymak için bir sorun olmaz gibi görünüyor.

MVCNetworking proje değiştir applicationStartup App Temsilci çağrı kaldırma ve yük içine kat bit koyarak yaptım. Bilgisayarım yanmamış, ama bu doğru olduğu anlamına gelmez! Yüklenemedi veya başlatılamadı karşı aramalısın özel bir kurulum yöntemi etrafında herhangi inceliklerini, sorunlar ve whatnots bir anlayış kazanmak için umut ediyorum.


Yük belgeleri diyor ki:

Yük mesajı hem sınıflar ve kategoriler gönderilir dinamik ve statik olarak bağlı, ama yeni yüklenen yalnızca yüklü sınıf veya kategori cevap verebilen bir yöntem uygular.

Bu cümle ve eğer tüm kelimelerin tam anlamını biliyor musun diye ayrıştırmak için kludgey zordur. Yardım!

  • "Dinamik olarak yüklenen ve statik olarak bağlı hem de?" ne demektir Bir dinamik olarak yüklenen VE statik olarak bağlı olabilir, ya da biri diğerine engel mi?

  • "...yeni yüklenen sınıf veya kategori uygulayan bir yöntem olan" Hangi yöntem? cevap verebilir Nasıl tepki?


Başlatmak için, belgeler diyor ki:

başlatma sadece bir kez sınıf başına çağrılır. Eğer gerçekleştirmek istiyorsanız sınıfın bağımsız başlatma ve kategorileri için sınıf, yük yöntemlerini uygulamak gerekir.

Bu "eğer Kur getirmeyi sınıfı... başlatmak kullanmayın." demek için alıyorum Tamam, tamam. Ne zaman veya neden başlatılamıyor saf dışı bırakabilir miyim?

CEVAP
10 Kasım 2012, CUMARTESİ


load mesajı

Çalışma zamanı, her bir sınıf, sınıf nesnesi süreci adresinde yüklendikten sonra çok yakında uzaya load ileti gönderir. Programın yürütülebilir dosyasının bir parçası olan sınıflar için zamanı çok erken load ileti süreci hayatı boyunca gönderir. (Dinamik olarak yüklenen) paylaşılan bir kütüphane sınıfları için, çalışma zamanı paylaşılan kütüphane işlemin adres alanına yüklenir hemen sonra yük ileti gönderir.

Ayrıca, çalışma zamanı yalnızca o sınıf load yöntemi kendisi uygular nesnesi bir sınıf nesnesi load gönderir. Örnek:

@interface Superclass : NSObject
@end

@interface Subclass : Superclass
@end

@implementation Superclass

  (void)load {
    NSLog(@"in Superclass load");
}

@end

@implementation Subclass

// ... load not implemented in this class

@end

Çalışma zamanı Superclass sınıf nesnesi load ileti gönderir. YokdeğilSubclass Superclass yöntemi miras olsa bile Subclass sınıf nesnesi load mesaj gönder.

Çalışma zamanı gönderir load ileti için bir sınıf nesnesi yaptıktan sonra gönderilmiş load ileti için tüm sınıfın üst sınıf nesneleri (eğer bu üst sınıf nesneleri uygulamak load) ve tüm sınıf nesneleri paylaşılan kitaplıkları bağlantı için. Ama diğer sınıfları kendi yürütülebilir henüz load almış bilmiyorsun.

Süreci adresini yükler her sınıf uzay load yöntemi uygular load mesaj alma, işlem sınıfı dışındaki diğer kullanım sağlar ne olursa olsun.

Çalışma zamanı objc-runtime-new.mm _class_getLoadMethod özel bir durum olarak load yöntem arar ve doğrudan aramaları nasıl objc-loadmethod.mm 26 *dan görebilirsiniz.

Ayrıca, çalışma zamanı aynı sınıf üzerinde çeşitli kategoriler load uygulamak bile yükler her kategori load Bu yöntem çalışır. Bu olağandışı bir durum. İki kategori aynı sınıfta aynı yöntemi tanımlarsanız normalde yöntemlerden biri” olması, ve diğer yöntemi hiç denecek. “kazanacak

initialize Yöntemi

Çalışma zamanı sınıf nesne veya sınıfın tüm örneklerini ilk mesaj (load initialize hariç) göndermeden önce bir sınıf nesnesi initialize yöntemini çağırır. Bu mesajı eğer sınıfı initialize ama bir sınıftan miras uygulamak değil eğer doğru değilse, o zaman sizin sınıf initialize kendi üst kullanacak kadar normal mekanizmasını kullanarak gönderilir. Çalışma zamanı sınıf superclasses initialize tüm ilk göndermek eğer superclasses zaten initialize gönderilmiş sığınak değil ().

Örnek:

@interface Superclass : NSObject
@end

@interface Subclass : Superclass
@end

@implementation Superclass

  (void)initialize {
    NSLog(@"in Superclass initialize; self = %@", self);
}

@end

@implementation Subclass

// ... initialize not implemented in this class

@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        Subclass *object = [[Subclass alloc] init];
    }
    return 0;
}

Bu program çıktı iki satır yazdırır:

2012-11-10 16:18:38.984 testApp[7498:c07] in Superclass initialize; self = Superclass
2012-11-10 16:18:38.987 testApp[7498:c07] in Superclass initialize; self = Subclass

Çünkü sistem gönderir initialize yöntem tembel bir sınıf değil bu ileti sürece programınızı gerçekten gönderdiği mesajlara sınıfı (ya da bir alt sınıf, örnekleri, sınıf veya sınıfları). Ve aldığınız zaman initialize, sürecinde her sınıf zaten load (uygunsa) almış olmalısınız.

initialize uygulamak için meşru bir yoldur bu

@implementation Someclass

  (void)initialize {
    if (self == [Someclass class]) {
        // do whatever
    }
}

Bu desen noktası Someclass initialize sağlamayan bir alt olduğunda yeniden başlatılıyor kendisi kaçınmaktır.

Çalışma zamanı objc-initialize.mm 48 *işlevi initialize ileti gönderir. objc_msgSend mesaj gönderme işlevi normal olan insanlarla ilişkilerini değerlendirmek için kullanılan görebilirsiniz.

Daha fazla okuma

Bu konuda Mike Ash's Friday Q&A Check out.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Washington

    Adam Washing

    12 Mayıs 2006
  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • Semantic Mastery

    Semantic Mas

    30 EKİM 2013