1. ホーム
  2. objective-c

[解決済み] Objective-CのIVERとPropertiesの違いは何ですか?

2023-08-09 22:32:35

質問

Objective-Cでivarとpropertyを使用する3つの方法の意味上の違いは何ですか?

1.

@class MyOtherObject; 
@interface MyObject {
}
@property (nonatomic, retain) MyOtherObject *otherObj;

2.

#import "MyOtherObject.h"
@interface MyObject {
    MyOtherObject *otherObj;
}
@property (nonatomic, retain) MyOtherObject *otherObj;

3.

#import "MyOtherObject.h"
@interface MyObject {
    MyOtherObject *otherObj;
}

どのように解決するのですか?

1番 は、コンパイラとリンカによって見られるコードの量を最小限にし、また潜在的に循環参照を避けるために、MyOtherObjectクラスを前方に宣言することによって、他の2つと異なっています。この方法で行う場合、.m ファイルに #import を置くことを忘れないでください。

プロパティを宣言する (そして .m ファイルで @synthesize に一致させる) ことで、指定した方法で処理されるメモリ セマンティクスを持つアクセッサ メソッドを自動生成します。ほとんどのオブジェクトの経験則は Retain ですが、NSStrings などは Copy を使うべきです。一方、SingletonやDelegateは通常Assignを使用する。アクセサを手で書くのは面倒だし、エラーになりやすいので、これは多くのタイピングと間抜けなバグを節約することができます。

また、合成されたプロパティを宣言することで、このようにドット記法を使ってアクセッサメソッドを呼び出すことができます。

self.otherObj = someOtherNewObject; // set it  
MyOtherObject *thingee = self.otherObj; // get it 

通常の、メッセージパッシングの方法ではなく

[self setOtherObject:someOtherNewObject]; // set it
MyOtherObject *thingee = [self otherObj]; // get it 

裏では本当にこのようなメソッドを呼び出しているのです。

- (void) setOtherObj:(MyOtherObject *)anOtherObject {

    if (otherObject == anOtherObject) {
        return;  
    }

    MyOtherObject *oldOtherObject = otherObject; // keep a reference to the old value for a second
    otherObject = [anOtherObject retain]; // put the new value in  
    [oldOtherObject release]; // let go of the old object
} // set it

...またはこれ

- (MyOtherObject *) otherObject {  
    return otherObject;
} // get it

めんどくせぇな、これ。では、それを すべての に対して行ってください。正確にやらないと、メモリーリークが発生します。コンパイラに任せるのが一番です。

なるほど 番号 1 はivarを持っていません。それがタイプミスでないと仮定すると、@property / @synthesize ディレクティブが裏であなたのために ivar を宣言してくれるので、それは問題ありません。 これは Mac OS X - Snow Leopard と iOS4 のための新機能だと思います。

3 番 はそのようなアクセサを生成しないので、自分で書かなければなりません。もしアクセサメソッドに副作用を持たせたいなら、上に示したように標準的なメモリ管理のダンスを行い、それからアクセサメソッドの内部で必要などんな副作用の仕事も行います。もしあなたがプロパティ を合成し、さらに自分自身で を作成する場合、次に のバージョンが優先されます。

すべて網羅できましたか?