8

このコード:

__weak VeryCool *weakSelf = self;
something.changeHandler = ^(NSUInteger newIndex) {
    if (newIndex == 0) {
        [weakSelf.options removeObjectForKey:@"seller"];
    }
};

プロパティ オプションが見つからないという警告が表示されます。options は ivar ですが、プロパティとして宣言されていないためです。プロパティとして宣言せずに、weakSelfからオプションを取得することは可能ですか?

4

2 に答える 2

26

ivar に直接アクセスするには、 を使用します->。例えば:

__weak VeryCool *weakSelf = self;
something.changeHandler = ^(NSUInteger newIndex) {
    if (newIndex == 0) {
        VeryCool* strongSelf = weakSelf;
        if (strongSelf)
            [strongSelf->options removeObjectForKey:@"seller"];
    }
};

インスタンス変数への直接アクセスはポインターに対してクラッシュするため、それstrongSelfが non-であることを確認することが重要です (これは、レシーバーを使用したメソッドの呼び出しとは異なり、プロパティ アクセスは単なるメソッド呼び出しです)。nilnilnil

于 2013-02-12T00:10:11.367 に答える
3

ivar を取得するためにウィーク ポインターを直接逆参照することはできません。nilそうしようとすると、自動動作によって引き起こされる競合状態によるコンパイラ エラーが発生します。

ただし、KVC は ivar を取得します。

[weakSelf valueForKey:@"options"]

これは、同じ名前のアクセサー メソッドを探します。何も見つからない場合は、ivar 自体の取得にフォールバックします。

メッセージの受信者valueForKey:は弱参照であるためnil、オブジェクトの割り当てが解除され、メッセージがノーオペレーションで送信された場合になります。したがって、self手動で AutomaticRC に希望どおりの動作をさせるために、もう一度再割り当てする必要がなくなります。

于 2013-02-12T00:07:25.873 に答える