2011-07-09 14 views
15

Objective-C'de bir sınıftaki bir değişkene -> (ok operatörü) ve . (nokta operatörü) kullanılarak erişme arasındaki fark nedir? -> doğrudan vs'ye erişmek için kullanılır (.) doğrudan değil mi? Ok gösterimde C miras'->' (ok operatörü) ve '.' Arasındaki fark nedir? (dot operatörü) Objective-C'de mi?

p->m 
(*p).m 

ve C çünkü var

+1

Benzer Soru:

SomeClass *obj = …; obj.name = @"Jim"; 

eşdeğerdir http://stackoverflow.com/q/9072688/642706) –

cevap

9

ok ->, bir işaretçi çözümlemesi ile birlikte bir nokta için bir kestirme bu iki bir işaretçi p için aynıdır yapı üyesi erişim operatörü (.), işaretçi hata giderme işlecinden (*) daha gevşek bir bağlantı kurar ve hiç kimse (*p).m yazmak istemez ve kullanıcı bir yapının içinde işaretçiyi *(p.m) belirtmek için operatör önceliğini değiştirmek ister. Böylece, ok parantezlerin çirkinliği olmadan p->m ve *s.p hassas bir şekilde yapabilmeniz için eklendi.

0

Ok operatörünü ptr->member kullandığınızda, bu işaretçiyi örtük olarak kaldırır. (*ptr).member'a eşdeğerdir. Bir nesne işaretçisine mesaj gönderdiğinizde, işaretçi de açıkça kaldırılır. Bir işaretçi tarafından başvurulan bir yapının üyesine erişmek için geleneksel C işleci

18

. Objective-C nesneleri (genellikle) işaretçi olarak kullanıldığından ve Objective-C sınıfı bir yapı olduğundan, üyelerine erişmek için (genellikle) örnek değişkenlere karşılık gelen ->'u kullanabilirsiniz. Sınıf dışından bir örnek değişkenine erişmeye çalışıyorsanız, örnek değişkeninin herkese açık olarak işaretlenmesi gerektiğini unutmayın.

Bu nedenle, örneğin:

SomeClass *obj = …; 
NSLog(@"name = %@", obj->name); 
obj->name = @"Jim"; 

nesne obj tekabül SomeClass (ya da üst sınıfı bir) bildirilen name değişken örneği, erişir.

Diğer yandan, ., (genellikle) dot syntax, getter ve yöntemleri için kullanılır. Örneğin:

SomeClass *obj = …; 
NSLog(@"name = %@", obj.name); 

alıcı yöntemini name kullanarak eşdeğerdir:

SomeClass *obj = …; 
NSLog(@"name = %@", [obj name]); 

Eğer name bir declared property, onun alıcı yöntemi başka bir ad vermek mümkündür.

Nokta sözdizimi ayrıca dizge yöntemleri için de kullanılır. [- C vs Objective-C içinde operatör kullanım Dot (“”) operatörü ve ok (“>”)] (: Örnek:

SomeClass *obj = …; 
[obj setName:@"Jim"]; 
+6

Örnek değişkenini özellikten farklı olarak adlandırırsanız, ayrım daha açık olur (örneğin '@synthesize name = ivar_name').Ardından, örnek değişkenine sadece "someObject-> ivar_name" ile erişebilir ve yalnızca özellik getcisine 'someObject.name' ile erişebilirsiniz. – Chuck

+0

@Bavarious Bu cevabı şu anda kafa karıştırıcı buluyorum, neden "isim" ne olduğu hakkında çok fazla tartışma var mı? Ad, örnek türünde getter/setter metodu olsun. obj, bir işaretçi, adı ne olursa olsun erişebilmeniz için ertelenmeli mi? Cevabınız basitçe bu obj-> ismi (* obj) .name ile aynı mıdır? Ya da cevabınız kısmen, Objective C alıcılarının/belirleyicilerinin objenin işaretçisini göz ardı etmemesi ve sadece nokta gösterimi ile kullanılabilir olmalarıdır. Belki de, SomeClass * obj =… öğelerinin her bildirimi için elips kullanılmadıysa; Ben daha iyi anlayacağım ... :) –

+0

@Chuck "Objective-C sınıfı bir yapıdır" demek? Bir sınıfın bir yapı olması ne anlama geliyor? Esasen farklı değiller mi? sınıflar referans türleridir ve yapılar değer türleridir? (Üzgünüm sana ping ettim ama Bavyera artık onun hesabını kullanmıyor) – Honey

İlgili konular