プロパティ属性“保持”動作していないようですか?
-
06-07-2019 - |
質問
Appleの多くのコード例の1つから少しのコードを実装しましたが、1つのプロパティのretain属性が機能していないように見えるため、少し問題があります。プロパティの宣言は次のとおりです。
@property (nonatomic, retain) EditingViewController *editingViewController;
そして、ここにコードがあります:
- (EditingViewController *)editingViewController {
// Instantiate the editing view controller if necessary.
if (editingViewController == nil) {
EditingViewController *aController = [[EditingViewController alloc] init];
editingViewController = aController;
[aController release];
}
return editingViewController;
}
(retain)が割り当て時に保持カウントを1増加させることになっていることを理解しています。ただし、自分で[保持]を送信するか、[aController release]を送信しないでください。ここに何が欠けていますか?
解決
editingViewController
を参照する場合、 self-> editingViewController
、つまりivarへのアクセスと同等です。
ゲッターまたはセッターを使用する場合は、 self.editingViewController
、または同等の [self setEditingViewController:aController]
を使用する必要があります。
これが、プロパティとは異なる名前のivarを使用することを好む理由です。例:
EditingViewController* i_editingViewController;
@property (nonatomic, retain) EditingViewController *editingViewController;
@synthesize editingViewController = i_editingViewController;
その後、レイジーゲッターを次のように記述できます。
- (EditingViewController *)editingViewController {
// Instantiate the editing view controller if necessary.
if (i_editingViewController == nil) {
i_editingViewController = [[EditingViewController alloc] init];
}
return i_editingViewController;
}
または
- (EditingViewController *)editingViewController {
// Instantiate the editing view controller if necessary.
if (i_editingViewController == nil) {
EditingViewController *aController = [[EditingViewController alloc] init];
self.editingViewController = aController;
[aController release];
}
return i_editingViewController;
}
editingViewController
の値(オブザーバーが見るように)は実際には変更されていないため、おそらく前者の方法(セッターを呼び出さない)を使用しますが、どちらの方法でも正常に動作し、異なる名前(ivarおよびpropertyの場合)混乱または偶発的な誤用を回避するのに役立ちます。また、このプロパティを使用することをお勧めします(わずかにいプレフィックスを避けるため)。
Appleは_プレフィックスを予約しており、セッターとゲッターを init
/ dealloc
ルーチンで使用しないでください。
他のヒント
このプロパティを使用するには、 self.editingViewController
を記述する必要があります。 " editingViewController
" self.editingViewController
は[self setEditingViewController:...]と同等であり、適切な保持/解放ジョブを実行しますが、Classメンバー変数への直接アクセスです。