SORU
11 HAZİRAN 2009, PERŞEMBE


Objective C mesaj gönderme mekanizması

Etrafta Objective C ile oynamak bakıyorum (oyuncak iPhone uygulamaları yazar) ve altında yatan mekanizma iletileri göndermek için kullanılan merak ediyorum. Ben iyi bir anlayış nasıl sanal fonksiyonlar C genellikle uygulanan ve maliyetleri nedir göreceli bir statik ya da sanal olmayan yöntem diyebilirsiniz ama elimde Hiç Yok arka plan ile N-C bilmek nasıl mesajlar gönderdi. Ben etrafında tarama IMP önbelleğe alınan iletileri teslim olan sanal işlev çağrıları, daha hızlı olmak, daha hızlı standart bir mesaj daha bahseder this gevşek kriter ve Gönder bulundu.

Bir şey optimize etmek, sadece mesajları gönderilir nasıl derin bir anlayış almak için çalışıyorum değilim.

  • Nasıl N-C iletileri gönderilir?
  • Nasıl Örnek Yöntem İşaretçiler önbelleğe ve (genel olarak) eğer bir mesaj önbelleğe eğer kodu okuyarak söyleyebilir mi?
  • Sınıf yöntemleri aslında bir C aynı işlevi (veya statik sınıf yöntemi C) veya orada başlarına bir şey mi?

Bu soruların bazıları 'uygulama bağımlı' ama gerçekten önemli olan tek bir uygulama var. olabilir biliyorum

CEVAP
11 HAZİRAN 2009, PERŞEMBE


Nasıl N-C iletileri gönderilir?

Objective-C iletileri gönderilme zamanı kullanma objc_msgSend() fonksiyonu. Apple docs gösterilen işlevi en az 2 argüman alır:

  1. Alıcı nesne
  2. Mesajın seçici
  3. [Mesaj gönderilmesini için bağımsız değişken bir liste.]

Bir sınıf örneği kendi sınıf nesne işaretçisi olan isa bir işaretçi var. Seçiciler yöntemleri her nesne saklanır bir "masa" sınıfı nesne ve objc_msgSend() fonksiyonu takip isa işaretçi sınıfı nesne, bu tablo ve denetler yöntemdir tablo için bir sınıf. Eğer bulamazsa, sınıfın üst sınıf tablosunda yöntemi arar. Eğer bulursa, bu iki yöntem bulur ya da kök nesnesi (NSObject) gelene kadar nesne ağacı kadar devam eder. Bu noktada, bir istisna atılır.

Nasıl Örnek Yöntem İşaretçiler önbelleğe ve (genel olarak) eğer bir mesaj önbelleğe eğer kodu okuyarak söyleyebilir mi?

Messaging: Apple'ın Objective-C çalışma zamanı rehberi

Mesajlaşma sürecini hızlandırmak için, çalışma zamanı sistemi seçiciler önbelleğe alır ve kullanılan yöntemler adresleri. Her sınıf için ayrı bir önbellek var, ve yöntemleri sınıf içinde tanımlanan kalıtsal yöntemlerinin yanı sıra seçiciler içerebilir. Dağıtım tabloları, aramadan önce, ileti rutin ilk alıcı nesnenin sınıf önbellek (bir kez kullanılan bir yöntem büyük olasılıkla tekrar kullanılabilir teorik olarak) kontrol eder. Yöntem seçici önbellek, mesajlaşma işlevi çağrısı daha sadece biraz daha yavaş. Bir program yeterince “gönderdiği iletileri önbelleğe alınan bir yöntem bulmak.” önbelleğe alır, neredeyse tüm sıcak çalıştığı bir kez Önbelleğe program çalışırken dinamik olarak yeni iletileri uyması için büyüt.

İfade alma programı çalıştırdıktan sonra, programın yeterince uzun süredir çalışıyor sonra oluşmaya başlar, yöntem çağrıları en önbelleğe yöntemi ile çalışır. Ayrıca dediği gibi, önbelleğe alma yöntemleri kullanılır olarak oluşur, bir mesaj sadece kullanıldığında önbelleğe alınır.

Sınıf yöntemleri aslında bir C aynı işlevi (veya statik sınıf yöntemi C) veya orada başlarına bir şey mi?

Sınıf nesneleri sınıfları benzer bir şekilde yöntem sevk kolu. Her sınıf nesnesi kendi içinde saklayan bir nesne varsınıfyöntem, bir nesne metaclass denir. Nesne teslim olabilir hangi süper metaclass nesneleri, var olan metaclass nesnesi isa kendi işaretçi vardır sınıfından sınıf nesneleri devralır. Yöntem sınıf yöntemlerine gönderme olarak:

  1. Sevk sistemi sınıf nesnesi isa metaclass nesneye işaretçi izler
  2. Metaclass nesnenin yöntem tablo sınıf yöntemi için aranır.
  3. Eğer bulursa, Arama, arama çalışmaları devam ediyor nerede metaclass nesnenin üst sınıf, devam ediyor.
  4. Bu işlem yöntemi bulundu, ya da kök metaclass bulunana kadar kadar tekrar, ve bir istisna atılır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • andony5589

    andony5589

    7 Aralık 2011
  • NicoleGrippo

    NicoleGrippo

    14 Kasım 2006
  • Tube Time

    Tube Time

    14 Mayıs 2013