2010-01-22 25 views
22

Olası Çoğalt:
How does an underscore in front of a variable in a cocoa objective-c class work?iPhone ivar adlandırma kuralı

Ben orada referans materyallerin bir çok, ben çok zaman, değişkenler olduğunu görüyoruz fark ettik Bu yapıldığında Neden

@synthesize variable = _variable; 

olarak .m dosyasında synthesize'd @ .h dosyasında _variable adlandırılır, mıydınız? Neyi kaçırıyorum?

Teşekkürler!

+0

'ivar 'yerine' ivar 'kullanılmakta olduğunu gördüm, ama daha iyi göründükleri için gerçekten bir argüman oluşturamıyorum ... –

cevap

21

bu. Bazı insanlar, sınıf değişkenlerini ayırmak için bunu açıklamak isterler ve başka bir yanıtlayıcı olarak gelen parametre adlarıyla çakışmayı önlemek için dikkat çeker. Apple örnek kodunda bile kullanım karıştırılır.

1) Bazı insanlar _ "özel" iyi bir göstergesi olduğunu düşünüyorum:

Ancak, büyük ölçüde _ öneki kullanmak ve iki güçlü nedenleri yok tercih ederler. Benim almam, NO dizisi yerel değişkeni bir setter/getter (property) olmadan erişilebilmesi ve bu nedenle TÜMün özel olması gerektiğine dikkat etmekteydi - bu nedenle, bunları otomatik tamamlamayı okumak ve kullanmak daha kolay bir şekilde adlandırmak değil mi?Parametrelerin adlarından herhangi bir çakışma derleyici tarafından hızlıca açığa çıkar ve parametrelerin (veya iç değişkenlerin) daha dikkatli bir şekilde adlandırılmasıyla önlenir.

2) (daha da iyi bir neden) - mülk, mülkiyet erişmek ve bildiride de yeniden adlandırılır sentezlemek için kullanılan aynı adlı bir iç sınıfı var üzerinde XCode "Refactor" kullanırsanız. Bir _ ile öneklenmiş bir sınıf değişkeninde refactor kullanırsanız, özellik adı değiştirilmeyecek - sadece iç isme eşleme sentez. Asla ismin, mülkten erişebileceği gerçek değişkene kadar değişmesini istemiyorum. Bu tek başına, _'u bir değişken öneki olarak kullanmak istemediğimden, çünkü isimleri değiştirmek, kod netliğini geliştirmek için yapabileceğiniz en yararlı şeydir.

+0

Yöntem parametrelerini adlandırma konusunda herhangi bir öneride bulunma ivar isimleri ile çatışma? Bu özellikle initWith * veya elle uygulanan özellik ayarlayıcıları için uygundur. Bir süre için "a/an" ve "yeni" öneklerini denedim, ancak her zaman kullanışlı değil (bir ad çoğul olduğunda olduğu gibi). Ayrıca, parametreler için altçizgi öneklerini denedim, ancak Apple'ın ve dev topluluk tercihlerinin ivar'larla alt çizgi kullanması nedeniyle çılgın okuyucular çıldırması çok kolay. Bir dereceye kadar bu, alt çizgi son eki için de geçerlidir. – aleh

+0

Bugünlerde, tüm iç sınıf değişkenleri için "\ _" öneklerini kullanıyorum (yalnızca biliyorum) çünkü bunları yalnızca özelliklerle kullanıyorum - ve özellikleri otomatik olarak iVars'ı _ ile önek olarak ekliyorum. Refactor özellikleri üzerinde çalışıyor ve özellikleriyle asla görmediğiniz özellikleriyle "\ _" gerçekten önemli değil. Aynı zamanda sahip olduğunuz çakışma sorununu da ortadan kaldırır. Yeni düşüncemi bir noktada yansıtmak için bu cevabı düzenleyeceğim. –

+0

Anladım. Yine de, kendi ivar'larına mülkler aracılığıyla erişmek (örneğin daha çok _ivar/ivar vs self gibi) konusunda tereddüt ediyorum.ivar): Genel yazılabilir özelliklere sahip olmanın ya da .m içinde yazılabilir olarak salt okunur özelliklerin yeniden okunmasını istemiyorum. Ama dediğiniz gibi, herhangi bir fikir birliği yoktur :) – aleh

1

Bu tamamen bir sözleşmedir.

[myObject variable] 

aslında doğrudan bir değişken erişen bir yöntem değil aradığınız: Eğer böyle bir yöntem alıcı çağrı yaptığınızda çünkü onun ortak varsayalım. _ önünde bir değişken hakkında konuştuğunuzu açıkça belirtir. Şahsen bu sözdizimi rahatsız edici ve rahatsız edici buluyorum. Gereksiz buluyorum, ama haklısın, burada ve orada ortaya çıkıyor.

4

Bazen insanlar mVarName (C++) kullanır ve Obj-c'de stil _varName gibi görünüyor. Sahip olabileceğiniz sorunlardan biri, bir işlev için argümanınızın ayarlandığını ... set: (int) x - AMA - x adında bir iVar'ınız var ... siz de derleyici bu gibi şeyler hakkında ağlayacaksınız - kafa karıştırıcı değil.

M, _, ne olursa olsun, sınıfın üye özellikleri neler olduğunu göstermek için yardımcı olur. Bu sözdizimi kullanarak

-(void) set:(int)x 
{ 
x = x; // x is an ivar! heh 
} 

VS

-(void) set:(int)x 
{ 
_x = x; // ahh I see! 
} 
15

ivar ve mülkiyet farklı şeylerdir olduğu daha net yapmak için bir seçenektir.

Sınıfı harici kodlamak için özelliği kullandığı için bir fark yoktur.

Sınıfın kendisinin uygulanmasındaki kod için, ivar mülkün yerine kullanıldığında bunu daha açık hale getirebilir.

@interface MyClass : NSObject { 
    NSNumber *num; 
} 
@property (nonatomic, retain) NSNumber *num; 
- (void)doSomething; 
@end 

@implementation MyClass 
@synthesize num; 

- (void)doSomething { 
    // set the property, num is properly retained 
    self.num = [NSNumber numberWithInteger:1]; 

    // accidentally set the ivar, num is NOT retained 
    num = [NSNumber numberWithInteger:2]; 
} 
@end 

ve şimdi Ivar ve mülk için farklı bir ad kullanarak: Örneğin

, biz NSNumber nesnesi için bir ivar/özelliği vardır ki konsensüs üzerinde yok

@interface MyClass : NSObject { 
    NSNumber *i_num; 
} 
@property (nonatomic, retain) NSNumber *num; 
- (void)doSomething; 
@end 

@implementation MyClass 
@synthesize num = i_num; 

- (void)doSomething { 
    // set the property, num is properly retained 
    self.num = [NSNumber numberWithInteger:1]; 

    // compiler error, there is no ivar named "num" 
    num = [NSNumber numberWithInteger:2]; 

    // set the ivar, so it needs to be a retained object 
    i_num = [[NSNumber alloc] initWithInteger:3]; 
} 
@end 
1

Apple, sürekli olarak kullandığı için '_' önekini kullanmamayı tercih ediyorum. Önekden kaçınarak, Ico'ların bir kakao dokunmatik sınıfını uzattığımda Apple'la çarpışmayacağı konusunda daha fazla güvenim var. Temel sınıf 'kaynağına erişemediğimizden bu, mevcut özel ivarların kazara yeniden kullanılmasını önlemek için bildiğim tek yoldur. ile başlayan

Yöntem isimleri gibi çok

“_”, tek bir çizgi karakteri, Apple tarafından kullanılmak için ayrılmıştır.

9

Önceki cevaplar bunun arkasındaki geçmiş eksik. Objective-C 2.0'den önce hiçbir özellik yoktu. Dolayısıyla, şu örnek değişkenlerle bir nesneye sahip olursunuz:

@interface MyObject: NSObject { 
    NSArray *myArray; 
} 

@end 

Diğer nesnelere nasıl erişirsiniz? Çözüm, ayarlayıcılar ve alıcılar yapmaktı. Ama karışıklığı önlemek için, bunlar aşağıdaki şekilde yapardı:

@interface MyObject: NSObject { 
    NSArray *_myArray; 
} 

- (NSArray *)myArray; 
- (void)setMyArray:(NSArray *)myArray; 

@end 

__myArray değişken örneği ve yönteme -myArray arasındaki karışıklığı yarar.

+0

Bir alt çizgi olmadan ivar adını tutmak myArray yöntem adı ile karıştırıldığından emin değilim. En azından derleyici tarafından değil. Bir yöntem [obj myArray] çağrısı ya da selector @selector (myArray) 'a başvurmak her zaman kendi ivar'ından (obj-> myArray ya da sadece myArray veya self-> myArray öğelerini kendi yöntemlerinden) almaktan farklıydı. – aleh

+0

Bir örnek sınıfında olduğunuzda daha fazlasıdır. Yanlışlıkla 'myArray = @ [@" A ", @" B ", @" C "];' 'myArray = @ [@" A ", @" B ", @" C "yerine; '. –

+0

Tamam, anlıyorum. Ben, 'selfArmy = ...' anlamında myArray = ... 'mistype yapmak daha kolay demek istediniz. – aleh

0

benim tercih Google ardından alt çizgi ekler ve (ı reimplementing ediyorum bile) açıkça sentezlemek için basitçe:

@synthesize varName=varName_; 

ben görürseniz o init..., dealloc dışında veya bir erişimci çizgi izleyen, Bir şeyin balık olduğunu biliyorum.

İlgili konular