İd'nin anlamı nedir?


98

Objective-C'yi öğrenmeye çalışıyorum ve şöyle bir cümleyle karşılaşmaya devam ediyorum:

-(id) init;

Ve idbir Objective C dil anahtar sözcüğü olduğunu anlıyorum , ancak "derleyici özellikle idişaretçi türü dönüştürme kurallarına göre davranır" demek ne anlama gelir ?

Sağındaki idnesneyi otomatik olarak bir işaretçi olarak belirler mi?


28
Egonun tam tersi. Bazı insanlar içinvoid*
Hot Licks

İşte soruyla ilgili bir tartışma: SO sorusu
dmitri

Yanıtlar:


123

idher tür için bir göstericidir, ancak void *bunun aksine her zaman bir Objective-C nesnesine işaret eder. Örneğin, tip bir şey ekleyebilir idbir NSArray için, ancak bu nesneler yanıt vermelidir retainve release.

Derleyici örtülü herhangi nesne artığını için tamamen mutlu idve sizin için döküm için idherhangi bir nesneye. Bu, Objective-C'deki diğer örtük çevrimlerden farklıdır ve Cocoa'daki çoğu kap türünün temelini oluşturur.


11
Ek: id 'nin tanımı typedef struct objc_object *id;, yani bir Objcnesneye işaret eder .
zhongwuzw

aynı NSObjectmı? yani, bir dönüş türü olduğunda idile değiştirebilir NSObjectmiyim?
ThunderWiring


33

idherhangi bir Objective-C nesnesine ( objc_object) bir göstericidir . Bu sadece bir boşluk gösterici değildir ve ona öyle davranmamalısınız. Geçerli bir isaişaretçiye sahip olması gereken bir nesneye başvurur. İçinde saklanabilen değerler idde sadece protokolün NSObjectvarlığını ve hatta kendisinden miras almayan sınıfın varlığını anlamlandırmaya başlayan ve onun soyundan gelenlerle sınırlı değildir . Derleyici, herhangi bir nesne türüne türe göre referans verilen bir nesneyi atamanıza, herhangi bir nesne türünü atamanıza ve herhangi bir mesajı (derleyicinin gördüğü) herhangi bir uyarı olmadan göndermenize izin verir.NSObjectNSProxyNSObjectidid


25

idgenel bir türdür. Bu, derleyicinin orada herhangi bir nesne türü bekleyeceği ve kısıtlamaları zorlamayacağı anlamına gelir . Orada birden fazla nesne sınıfı kullanmayı bekliyorsanız yararlı olabilir; daha sonra hangi sınıf olduğunu bulmak için iç gözlemi kullanabilirsiniz. idObjective-C'deki tüm nesneler işaretçi / referans olarak aktarıldığı için otomatik olarak bir işaretçi varsayar.

Bazı Ek Kaynaklar:
id - NSObject - id *
Objective-C Programlama (Vikikitaplar)
Introspection
Dinamik Yazma


9
  • id , Objective-C'deki nesne tanımlayıcılarının bir veri türüdür ve hangi sınıfa sahip olursa olsun her türden nesne için kullanılabilir. id , tüm nesnelerin son süper türüdür.

Java veya c # 'de böyle kullanıyoruz

 Object data = someValue;


 String name =(Object)data;

ama c hedefi

id data= someValue;



NSString *name= data;

5

Evet ve hayır. id xX'i bir işaretçi olarak atamış olmanın , ancak işaretçi türü dönüştürme kurallarının geçerli olduğunu söylemenin yanlış olduğu doğrudur , çünkü "id" özel tür dönüştürme kurallarına sahiptir. Örneğin, bir void *işaretçi ile bunu yapamazsınız:

void *x;
char *y = x; // error, this needs an explicit cast

Tam tersine id ile mümkündür:

id x;
NSString *y = x;

Hedef c örneklerinde daha fazla id türü kullanımına bakın .

Ek olarak, "modern" Hedef C'de instancetype"init" yöntemlerinde "id" yerine kullanılması tercih edilir . Bunu değiştirmek için Xcode'da otomatik bir dönüştürme aracı bile var. İnstancetype hakkında bilgi edinin: id yerine instancetype kullanmaya başlamak yararlı olur mu?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.