SORU
24 HAZİRAN 2010, PERŞEMBE


Neden [Sınıfım sınıf] Objective-C yapmak zorunda mıyız?

Objective-C sınıf yöntemlerini çağırabilirsiniz:

[MyClass aClassMethod];

Ve bir örneğinin türlü sorgulama yapabilirsiniz:

[someInstance isKindOfClass:[MyClass class]];

Ama, neden [MyClass class], ve sadece bu gibi MyClass sağlamak için ihtiyacımız var:

[someInstance isKindOfClass:MyClass];

Derleyici bağımsız değişken olarak bir alıcı olarak MyClass (işaretçi türü) ile karşılaşıyor ama iyi bir nedeni var mı? Dil ayrıştırma bir sınırlama mı? Ya da belki de derleyici bir sınırlama?

CEVAP
24 HAZİRAN 2010, PERŞEMBE


Ooooh... eğlenceli bir soru. Cevap c-izm.

Düşünün:

@interface MyClass : NSObject
@end
@implementation MyClass
@end

Şimdi, söyleyin:

...
MyClass *m = nil;
...

Bu bağlamda, derleyici tür bir tanım olarak MyClass görür. * 18 ** değişken pointer to a hunk o' memory that contains one (or many -- don't forget your C pointer-fu) MyClass instances olduğunu söylüyor.

Başka bir deyişle, MyClass Bir tür.

Ama, bir şey bağlamında gibi:

[someInstance isKindOfClass: x ];

x bir rvalue ya, insan açısından, olması gerekirbir ifadenin değeri. Bir tür, ancak, bir rvalue olarak kullanılamaz.

[MyClass class] çalışıyor aslında biraz kesmek, hem de Dili ve derleyicisi olan dilbilgisi özellikle sağlayan bir tür adı olmak mesaj alıcı (için hedef bir yöntem çağrısı).

Ve, aslında, yapabilirsiniz:

typedef MyClass Foo;
....
[MyClass class];
[Foo Class];

Her şey yoluna girecek. Ancak, aşağıdaki yapamazsınamahata iletisini aydınlatıcı

[NSUInteger class];

hata: ‘değil Objective-C sınıf adı ya da takma adı.’ NSUİnteger

Şimdi, neden özel bir durum değil çıplak bir isim olarak her yerde?

Bu tür isimler iş çeviriyor ve hızlı bir şekilde oldukça rahatsız bir şekilde o bölge aynı türde roller vermeyi üzerine taşıyor [foo isKindOfClass: (MyClass *)]; kusmaktan [foo isKindOfClass: (MyClass)]; gibi bir şey yutmak zorunda sonunda rvalues.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EmbarkToHeaven

    EmbarkToHeav

    3 EYLÜL 2007
  • Kanál používateľa McsFuego

    Kanál použ

    12 EKİM 2011
  • RD

    RD

    19 NİSAN 2006