Neden [nesne] bir şey değil [*nesne bir şey var mı?
Objective-C, neden [object doSomething]
? O zamandan beri [*object doSomething]
nesneyi, bir yöntem arıyorlar olmazdı hangi işaretçi çözümlemesi gerektiği anlamına gelir?
CEVAP
Cevap geri dönmüştür C kökleri Objective-C Objective-C özgün olarak yazılmış bir derleyici ön-işlemci için C, Objective-C değildi derlenmiş Çok olarak değişime uğramış içine düz C ve derlenmiş.
10* *tip tanımı ile başlar. Olarak bildirildi:
typedef struct objc_object {
Class isa;
} *id;
Yani id
Bir tür Sınıf, kendisini, bir sınıf tanımlayan bir yapı için bir işaretçi () olan bir yapı için bir işaretçi. Şimdi, NSObject
düşünün:
@interface NSObject <NSObject> {
Class isa;
}
NSObject
düzeni ve türü id
ile işaret düzeni aynı olduğunu unutmayın. Çünkü, gerçekte, bir örnek, bir Objective-C nesne gerçekten sadece bir işaretçi yapısı olan ilk alan, her zaman bir işaretçi -- puan sınıf içeren yöntemleri için örnek (ile birlikte diğer bazı meta verileri).
Ne zaman alt NSObject ve eklemek bazı örnek değişkenleri, tüm niyet ve amaçlar, sadece oluşturma Yeni bir C yapısı içeren örnek değişkenleri olarak yuva yapısı birleştirilmiş yuvaları için örnek değişkenleri için tüm superclasses. (Modern çalışma zamanı çalışırbirazbir üst sınıf bugün ivan'ın tüm alt çekirdekler gerektirmeden eklenmiş) böylece farklı.
Şimdi, bu iki değişken arasındaki farkı göz önünde bulundurun:
NSRect foo;
NSRect *bar;
(Basit bir C yapısı yok ObjC dahil) olmak NSRect. foo
yığın depolama ile oluşturulur. Yığın çerçevesi kapalı olduğu bir hayatta değil, ama aynı zamanda herhangi bir bellek boşaltmak için yok. bar
, büyük olasılıkla, öbek malloc()
kullanarak oluşturulan NSRect bir yapı için bir referanstır.
Eğer söylemek deneyin:
NSArray foo;
NSArray *bar;
Derleyici ilk hakkında, çizgisinde bir şey söyleyerek şikayet edernesneler yığını Objective-C . izin verilmez tabanlı . Diğer bir deyişle,tümObjective-C nesne öbek (daha fazla veya daha az ... bir veya iki istisna dışında, ama bu tartışma için nispeten ezoterik) ve, sonuç olarak, sizden ayrılması gerekirher zamanöbek söyledi nesnenin adresi ile bir nesneye bakın; her zaman nesnelere işaretçiler (id
yazın hiç eski nesne için bir işaretçi) ile çalışıyoruz.
C geri dilin işleyişi kökleri almak, örneğin, C eşdeğer bir satır için her yöntem çağrısı çevirebilir, kod aşağıdaki iki satır aynıdır:
[myArray objectAtIndex: 42];
objc_msgSend(myArray, @selector(objectAtIndex:), 42);
Benzer şekilde, bir yöntemi şöyle açıkladı:
- (id) objectAtIndex: (NSUInteger) a;
C işlevine eşdeğerdir bu şekilde ilan etti
id object_at_index(id self, SEL _cmd, NSUInteger a);
Ve, objc_msgSend()
ilk bağımsız değişken bakıyor 27 ** türü olarak ilan etti
OBJC_EXPORT id objc_msgSend(id self, SEL op, ...);
Ve bu yöntemi bir ara hedef olarak *foo
kullanmadığınız yüzden. Yaptığı çeviri ile yukarıdaki biçimleri-arama [myArray objectAtIndex: 42]
tercüme etmek için yukarıdaki C işlev çağrısı sonra gerekir diye bir şey ile eşdeğer C işlev çağrısı ilanı (tüm giyinmiş yöntem sözdizimi).
Nesne başvurusu yürütülmesi verir, çünkü haberci -- objc_msgSend() erişmek için sınıfa bulun yöntemi olarak uygulanması-o referans olma o zaman ilk parametre -- -- kendine ait yöntemi olduğunu sonunda idam edildi.
Eğer gerçekten derin gitmek istiyorsan, start here. Ama tam 32* *kadar zahmet etme.
Neden UnhandledExceptionEventArgs.Bir ...
Nesne başvurusu bir nesnenin örneğine ...
Neden't bir WordPress kullanmak d...
Neden int-Nesne bir karşılaştırma geçe...
Neden [nesne] bir şey değil [*nesne bi...