2011-12-14 9 views
11

örnek değişkenlerden miras? Amaç-c 2.0 neden alt sınıfları <code>self</code> anahtar kelimeyi kullanarak ana sınıflarında örnek değişkenleri başvurmak gerekiyor ise Objective-c

bu örneği düşünün: Aslında bir değişkeni tanımlı değil

// a.h 
@interface MyClass : NSObject 
@property (nonatomic, retain) Object *myObject; 
@end 

// a.m 
@implementation MyClass 
@synthesize myObject; 
@end 


// b.h 
@interface AnotherClass : MyClass 
@end 

// b.m 
@implementation AnotherClass 
- (void) someMethod { 
    // error 
    // Object *obj = myObject; 

    // works 
    // Object *obj = self.myObject; 
} 
@end 
+2

Bu kadar [Kevin Ballard'ın yanıtı] (http://stackoverflow.com/a/8511046/) ile açıklanabilir [sentezlenmiş Ivars görünürlüğü nedir?] (Http://stackoverflow.com/questions/8510464/) birkaç saat önce. –

cevap

11

, sadece (örtük anlamda özel bir değişkeni tanımlar) bir özelliği tanımladı. Ve özellik sadece yöntem olduğundan, nokta sözdizimine ihtiyacınız var. self.property'un [self property] ile aynı olduğunu unutmayın.

Bunu düzeltmek için, bir değişken belirtin. Değişkenin mülkten farklı bir adı olduğu bir örnek vereceğim. Çoğu insan aynı adı hem seçti, hem de farklı olduklarını görmek için, hangisinin kastedildiğini hemen görüyorum.

// a.h 
@interface MyClass : NSObject { 
    // Instance variables are "protected" by default, except if you 
    // use @private or @public. 
    Object *myObjectVar; 
} 

@property (nonatomic, retain) Object *myObject; 
@end 

// a.m 
@implementation MyClass 
@synthesize myObject = myObjectVar; 
@end 


// b.h 
@interface AnotherClass : MyClass 
@end 

// b.m 
@implementation AnotherClass 
- (void) someMethod { 
    // works 
    Object *obj = myObjectVar; 

    // works 
    obj = self.myObject; 

    // the same as self.myObject 
    obj = [self myObject]; 
} 
@end 

Not atamak farkı: Eğer nesne otomatik olarak tutulmaz sizin değişkene atarsanız.

myObjectVar = someObject; // not retained, old object not released! self.myObject = someObject; // old object released, new object retained [self setMyObject:someObject]; // same as the line above 

Düzenleme

: @Jason Coco tarafından belirtildiği gibi, sentezlenen örnek değişkenler varsayılan olarak gizli olduğu Söz Ama bu özelliğini kullanıyorsanız korunur. Ve @NSGod, normal örnek değişkenlerinin varsayılan olarak korumalı varsayılan değil, varsayılan olarak doğru olduğunu doğru.

+1

'sentezlenen özellikler aslında adlarının bir örneğini oluştururlar, ancak bir' @ private' ivar sentezlerler. Yanıt verirsiniz çünkü özellikle ivar'ı yaratmış ve sentezleyiciyi daha az kısıtlayıcı bir erişim seviyesine atamışsınız, çünkü sentezleyiciler ivar üretmemektedir. –

+0

Sentezleyicilerin ivar üretmediğini söylemedim, değil mi? İlk cümlemi gör. Ama onların özel olduklarını açıkladığın için teşekkürler. – DarkDust

+0

Oh, haklısın. Acı çekerken, parantezimi yanlış anladım. –

8

Onlar yapamaz, aslında üst sınıfta bir örnek değişkeni bildirmek yerine, (erişimci yöntemleri sentezleme ek olarak) örnek değişkeni sentezlemek için yeni çalışma zamanının yeteneğine güvenmek sağladı. Değişken sentez hakkında daha fazla bilgi için bkz. The Objective-C Programming Language: Runtime Difference.

@interface MyClass : NSObject 
@property (nonatomic, retain) Object *myObject; 
@end 

için:

Örneğin, aşağıdaki değiştirmek gerekirdi doğrudan örnek değişkeni başvurmak edebilmek için varsayılan olarak

@interface MyClass : NSObject { 
// there is an implied @protected directive here 
    Object *myObject; 
} 

@property (nonatomic, retain) Object *myObject; 

@end 

, örnek değişkenler @protected vardır sınıf ve alt sınıfların örnek değişkenlere doğrudan erişebildiği anlamına gelir. @protected ivars, @public ivars adresinden farklıdır; -> numaralı telefondan erişim sağlayamazsınız. @private ivarlara yalnızca bunları bildiren sınıf tarafından erişilebilir. Daha fazla bilgi için bkz. The Objective-C Programming Language: The Scope of Instance Variables.

İlgili konular