2016-09-01 42 views
7

sınıflara benİleri Bildirisi

// 
// MyClassA.h 
// 

@interface MyClassA : NSObject 

@property (strong, nonatomic, readonly) MyClassB *myClassB; 

@end 

MyClassB bir özelliğe myString sahiptir tip MyClassB bir özelliği vardır MyClassA var.

// 
// MyClassB.h 
// 

@interface MyClassB : NSObject 

@property (copy, nonatomic, readonly) NSString *myString; 

@end 

Ben gerçekleştirimdir içinde myString erişmesi gerekir MyClassC var.

ben Should -

a) İleri Genelde MyClassA.h

cevap

2

yılında MyClassC.m

veya

b) #import MyClassB.h içinde MyClassA.h yılında MyClassB ve #import "MyClassB.h" beyan, sen ile beyan yönlendirsin Mümkünse başlık dosyalarınızda @class. Muhtemelen bunu yapmak istemeyeceğiniz tek şey, bir süper sınıftan mi yoksa protokol uyumluluğunu beyan ettiğiniz zaman, çünkü derleyicinin o sınıfta veya protokolde neler olup bittiğini bilmesi gerektiğidir.

Bu örnekte, başlık dosyalarınızdaki tüm özellik beyanlarınız için @class ve MyClassC.m dosyanızda #import MyClassB.h kullanırdım. Bu MyClassC'nin MyClassB'deki tüm özellikleri bilmesini sağlayacaktır.

2

Biraz farklı bir açıdan baktığımızda, dünyanın gerçekten myClassB'un MyClassA bir özelliği olduğunu bilmesini isteyip istemediğinize karar vermeniz gerekiyor. Örneğin, MyClassA aracılığıyla edinebileceğiniz myString numaralı reklamı yalnızca reklam vermek isteyebilirsiniz. Bu, diğer sınıfların myString'un temel uygulamasını bilmesini sağlar. MyClassB'u göstermeniz gerekmedikçe, onu "dünyanın geri kalanından" gizlemelisiniz. aşağıdaki gibi MyClassA.h değiştirecek Bu durumda

: MyClassA.m yılında

// 
// MyClassA.h 
// 

@interface MyClassA : NSObject 

@property (strong, nonatomic, readonly) NSString *myString; 

@end 

, aşağıdakileri yapmanız olacaktır.

// 
// MyClassA.m 
// 

#import "MyClassA.h" 
#import "MyClassB.h" 

@interface MyClassA() 

@property (strong, nonatomic) MyClassB *myClassB;; 

@end 

@implementation MyClassA 

// Other meaningful code omitted 

- (NSString *)myString { 
    return self.myClassB.myString; 
} 

@end 

ne ben burada yaptığım içten myClassB için özellik tanımlamak için anonim bir kategori kullanmak olduğunu unutmayın. Buradaki önemli nokta, MyClassB'un diğerlerine gösterilmemesinin mantıklı olup olmadığıdır. Bu yaklaşımın ana avantajı, kodunuzun daha kolay uygulanabilir olmasıdır. myString'un farklı bir yoldan türetildiğini varsayalım. Tamamen farklı bir sınıftan veya farklı bir yöntemden. myString'u tüketmesi gereken kod aşılanır.

MyClassB'u açığa çıkarmanız gerekiyorsa, o zaman Tyler'ın yukardan ya da #import MyClassB.h MyClassA.h adresinde önerildiği gibi @class'u kullanabilirsiniz. En iyi uygulamalar, @class bildirimini ileri sürerek reçete eder. Ancak zaman zaman uygulama dosyasında çok sayıda dosyayı içe aktarmak zorunda kalmamanın rahatlığı kazanabilir. Kod tabanınız, bu yüzden hangisinin sizin için en uygun olduğunu seçebilirsiniz. Genelde ikisinin bir kombinasyonunu kullanırım.