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
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.
Nereye ve neden&; şablon" quot; ve...
Objective C içinde soyut bir sınıf olu...
Neden Java statik olarak bir sınıf bil...
Nasıl sınıf iterable yapmak için?...
Neden Objective-C delegeler genellikle...