2

多くの Apple コード例の 1 つからコードを少し実装しましたが、プロパティの 1 つの保持属性が機能していないように見えるため、少し問題があります。プロパティ宣言は次のとおりです。

@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 keep] を自分で送信するか、 [aController release] を送信ない限り、コードは失敗します。ここで何が欠けていますか?

4

2 に答える 2

4

を参照する場合は、ivar へのアクセスeditingViewControllerと同等です。self->editingViewController

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とプロパティの)異なる名前が混乱を避けるのに役立ちます。偶発的な誤用。また、プロパティを使用することを穏やかに奨励しています (少し醜い接頭辞を避けるため)。

initApple は _ プレフィックスを予約しており、 /deallocルーチンではセッターとゲッターを使用しないでください。

于 2009-08-01T06:33:12.480 に答える
0

self.editingViewControllerプロパティを使用するには、書き込みが必要です。" editingViewController" は Class メンバー変数への直接アクセスですが、self.editingViewController[self setEditingViewController:...] と同等であり、適切な保持/解放ジョブを実行します。

于 2009-08-01T06:17:27.470 に答える