SORU
3 ŞUBAT 2010, ÇARŞAMBA


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
6 ŞUBAT 2010, CUMARTESİ


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.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DrakeVEVO

    DrakeVEVO

    17 AĞUSTOS 2009
  • steven johns

    steven johns

    11 Mart 2011
  • undrmyumbrellaa

    undrmyumbrel

    25 Temmuz 2012