プロパティは、データにアクセスするための便利な方法です。したがって、プロパティ @property (nonatomic、retain) SomeType* someObject; を宣言するとき。これは、アクセス中に合成された 2 つのメソッドがあることを意味します。
ゲッター:
-(SomeType*) someObject {
return someObject;
}
セッター
-(void) setSomeObject:(SomeType*) obj {
[someObject release];
someObject = [obj retain];
}
したがって、プロパティと ivar の主な違いは、プロパティがセッター/ゲッター メソッドを動的に作成することです (そして、それらをオーバーライドできます)。しかし、someObject = new_val と書いているときは、メモリの場所への参照をコピーしているだけです。1 つのアセンブリ命令を除いて、追加の作業は行われません。
言及すべきもう 1 つのことがあります: アトミックと非アトミックです。アトミックでは、合成されたセッター/ゲッターは、他のスレッドでのセッターのアクティビティに関係なく、常に値全体がゲッターから返されるか、セッターによって設定されることを保証します。つまり、スレッド B がセッターを呼び出しているときにスレッド A がゲッターの途中にある場合、実際に実行可能な値 (おそらく自動解放されたオブジェクト) が A の呼び出し元に返されます。
非アトミックでは、そのような保証はありません。したがって、非アトミックはアトミックよりもかなり高速です。
編集:したがって、別のスレッドからアクセスされる変数がある場合、または/および追加の作業を行う必要がある場合(たとえば、保持、いくつかのフラグを上げる...)、選択はプロパティです。ただし、変数が頻繁にアクセスされる場合があり、プロパティを介したアクセスは大きなオーバーヘッドにつながる可能性があります。これは、プロセッサが合成してメソッドを呼び出すためにより多くの操作を実行する必要があるためです。