質問

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メンバー変数への直接アクセスです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top