[解決済み] Objective-CのIVERとPropertiesの違いは何ですか?
質問
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 番 はそのようなアクセサを生成しないので、自分で書かなければなりません。もしアクセサメソッドに副作用を持たせたいなら、上に示したように標準的なメモリ管理のダンスを行い、それからアクセサメソッドの内部で必要などんな副作用の仕事も行います。もしあなたがプロパティ を合成し、さらに自分自身で を作成する場合、次に の のバージョンが優先されます。
すべて網羅できましたか?
関連
-
[解決済み] リフレクションを使用して文字列からプロパティ値を取得する
-
[解決済み] Objective-Cの#importと#includeの違いは何ですか?
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] JavaScriptでオブジェクトのキー/プロパティの数を効率的にカウントする方法
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] HTMLのプロパティと属性の違いは何ですか?
-
[解決済み] クラスメソッドとインスタンスメソッドの違いは何ですか?
-
[解決済み] Objective-Cのセレクタ?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] NSPredicate: NSDateプロパティの日によるオブジェクトのフィルタリング
-
[解決済み] ARCで__autoreleasing ownership修飾子を記述する必要があるのは、どのような場合ですか?
-
[解決済み] NSURLをローカルファイルのパスに変換する
-
[解決済み] NSDictionaryにboolean値を追加するにはどうすればよいですか?
-
[解決済み] ブロックベースのAPIメソッドでnonnullとnullableのObjective-Cキーワードを使用する方法
-
[解決済み] iOSアプリ:通知を消去するには?
-
[解決済み] iOSアプリケーションの最上位ビュー/ウィンドウへの参照取得
-
[解決済み] ARCはディスパッチキューをサポートしていますか?
-
[解決済み] NSSetからのオブジェクトの取得