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
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.
Swift yerel temel sınıf veya NSObject...
Çeşitli "eylem Oluştur&; Visual S...
Biri kredi kartı veri - bunu nasıl yap...
'bir değişkeni bildirmek "ıd...
Python ____ ve self ınit ne yapıyorlar...