点と矢印
「ドット表記」は、Objective-Cに最近追加されたものであり、アクセサに簡略表記を提供します。オブジェクト(または構造体!)へのポインタがある場合、そのインスタンス変数にアクセスすることはできませんが、。を使用する.
だけ->
です。
あなたのライン
sharedInstance.classBReference = self;
とまったく同じです
[sharedInstance setClassBReference:self];
問題は、そのような方法がないことです-setClassBReference:
。インスタンス変数を設定するには、代わりに次のように記述する必要があります。
sharedInstance->classBReference = self;
@保護された変数
これでラインを切り替えた後、(まだ行っていない場合は@public
)エラーが表示される場合があります
インスタンス変数' classBReference
'はプライベートです
この場合、であると宣言されるclassA
ようにインターフェースを変更する必要があります。のインスタンス変数のリストは次のようになります。classBReference
@public
classA
@interface classA : NSObject
{
//@protected
//(The @protected keyword is optional when at the beginning of the list; instance
//variables are protected by default, which is why you're needing to declare your
//instance variable classBReference to be @public (since classB is not a subclass
//of classA and consequently cannot access its protected instance variables).
//....
//some protected instance variables
//....
@private
//....
//some private instance variables
//....
@public
//....
//some public instance variables
classB *classBReference;
//....
@protected
//....
//some more protected instance variables
//Note that @protected is not optional in order to make the instance variables
//here be protected since they are declared subsequent to the prior @public.
//....
}
//....
@end
@propertiesの使用
classBReferenceの場合
そうは言っても、一般的にインスタンス変数ではなくアクセサーを使用する方が良い方法と広く見なされています。これを行うには、classA
インターフェイスにプロパティを追加する必要があります。
@interface classA : NSObject
{
classB *classBReference;
}
@property classB *classBReference;
@end
classBReference
次のように、プロパティを合成して、の実装でclassBReference
インスタンス変数にアクセスします。classA
@implementation classB
@synthesize classBReference = classBReference;
一般的な設定
インスタンス変数と同じ名前のプロパティの両方があるため、これ@synthesize
はやや不明確です。いくつかの説明が必要です。一般に、クラス(この例では " MyObject
")では@interface
、インスタンス変数(myVariable
この例では "")とプロパティ(この例では"")を宣言しますmyProperty
。
@interface MyObject : NSObject
{
SomeObject *myVariable;
}
@property SomeObject *myProperty;
@end
クラスの@implementation
1つには行があります
@synthesize myProperty = myVariable.
このコードの結果は、インスタンスが与えられた場合です
MyObject *object = //...
クラスの、1つは書くことができます
SomeObject *someObject = //...
[object setMyProperty:someObject];
と
SomeObject *someOtherObject = [object myProperty];
-setMyProperty:
のインスタンスを呼び出した結果は、メソッドに渡された引数(この場合MyObject
はmyVariable
)と等しく設定されsomeObject
ます。同様に、-myProperty
のインスタンスをMyObject
呼び出した結果myVariable
が返されます。
それは私たちに何をもたらしますか?
@property
andディレクティブがない@synthesize
と、メソッドを宣言する必要があります
- (void)setMyProperty:(SomeObject *)myProperty;
- (SomeObject *)myProperty;
手動で定義し、手動で定義します。
- (void)setMyProperty:(SomeObject *)myProperty
{
myVariable = myProperty;
}
- (SomeObject *)myProperty
{
return myVariable;
}
@property
およびは、この@synthesize
コードにいくつかの要約を提供します。さまざまなプロパティ属性を使用すると、生成されるコードの量がさらに有益になります。
注:andディレクティブについてはさらに多くのことが言えます。まず、変数名を省略して記述できるだけでなく、の合成も完全に省略できます。この2つの場合、自動的に使用される変数名は異なります。 @property
@synthesize
@synthesize myProperty;
myProperty
ドット表記についてもう少し
あなたの質問からのドット表記は、略語の別の層を提供します。書く必要はなく
[object setMyProperty:someObject];
あなたは今書くことができます
object.myProperty = someObject;
同様に、書く必要はありません
SomeObject *someOtherObject = [object myProperty];
あなたは今書くことができます
SomeObject *someOtherObject = object.myProperty;
これは単なる表記であることに注意することが重要です。object.myProperty
「ちょっと」のように見えますが、「等しい」に設定すると単純な割り当てを行っていますが、そうsomeObject
ではありません。特に、ラインを実行するとき
object.myProperty = someObject;
メソッド
- (void)setMyProperty:(SomeObject *)someObject
実行されます。このため、ドット 表記 は いくつかの論争の 対象 です 。これは便利ですが、コードが何をしているのかを覚えておくことが重要です。