2016-09-01 7 views
7

をサブクラス私は前方宣言

// 
// MyClassA.h 
// 

@interface MyClassA : NSObject 

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

@end 

MyClassBプロパティmyStringを持っているタイプMyClassBの性質を持っているMyClassAを持っています。

// 
// MyClassB.h 
// 

@interface MyClassB : NSObject 

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

@end 

私はそれの実装でmyStringにアクセスする必要があるMyClassCを持っています。

は私べき - フォワード一般にMyClassA.h

答えて

2

MyClassC.mMyClassA.h#import "MyClassB.h"MyClassB

または

B)#import MyClassB.hを宣言

a)に、あなたは前方で宣言する必要があります可能であればヘッダーファイルに@class。あなたがおそらくそれをしたくないのは、コンパイラがそのクラスまたはプロトコルで何が起こっているのかを知る必要があるため、スーパークラスから継承したり、プロトコルの適合性を宣言したりするときだけです。

この例では、ヘッダーファイルのすべてのプロパティ宣言に@classを使用し、MyClassC.mファイルには#import MyClassB.hを使用します。これによりMyClassCはMyClassBのすべてのプロパティについて知ることができます。

2

これは若干異なる角度から見ています。myClassBについては、世界が実際に知りたいかどうかを判断する必要があります。MyClassAです。たとえば、MyClassAで取得できるmyStringを宣伝したい場合のみです。これにより、他のクラスは基本的な実装であるmyStringを知ることができなくなります。 MyClassBを公開する必要がある場合を除き、それを「他の世界」から隠す必要があります。次のようにMyClassA.h変化するであろう。この場合

:MyClassA.mで

// 
// MyClassA.h 
// 

@interface MyClassA : NSObject 

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

@end 

は、次の操作を行います。

// 
// 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 

私はここでやったことは、内部myClassBのプロパティを定義するには、匿名のカテゴリを使用されることに注意してください。

ここで重要なことは、MyClassBを他人に公開しないと意味があるかどうかです。このアプローチの主な利点は、コードがより順応性が高いことです。 myStringが別の方法で派生したとしましょう。別のクラスまたは異なるメソッドから。 myStringを消費する必要があるコードは予防接種されます。

MyClassBを公開する必要がある場合は、上記のタイラーの推奨に従って@class、またはMyClassA.hの#import MyClassB.hを使用できます。ベストプラクティスは、前方宣言の@classを規定しています。しかし、時には、実装ファイル内にたくさんのファイルをインポートすることを覚えておく必要がないという利便性が勝ち残ります。それはあなたのコードベースなので、あなたに最適なものを選ぶことができます。私は一般的に2つの組み合わせを使用します。