2

ここでQHTTPOperation.{h/m}見つかったアプリケーションで使用すると、すべて正常に動作しますが、次のように 8 つの警告が表示されました。

書き込み可能なアトミック プロパティ 'acceptableStatusCodes' は、合成されたセッター/ゲッターをユーザー定義のセッター/ゲッターとペアにすることはできません

書き込み可能なアトミック プロパティ 'acceptableContentTypes' は、合成されたセッター/ゲッターをユーザー定義のセッター/ゲッターとペアにすることはできません

書き込み可能なアトミック プロパティ 'authenticationDelegate' は、合成されたセッター/ゲッターをユーザー定義のセッター/ゲッターとペアにすることはできません

...

上記のリンクのプロジェクトに関連する警告がないことに気付いたので、私は尋ねていますQHTTPOperation.{h/m}.

何か案が?

ありがとう

4

2 に答える 2

8

プロパティを宣言しますnonatomic

コンパイラーは、ユーザー定義のアクセサーの実装がアトミックまたは非アトミックであることを検証しないため、アトミックではないと想定します。これは、実際の実装がオブジェクトレベルのスピンロック(場合によっては)を使用し、実装を裏付けるデータが私たちから抽象化されていることを考えると、かなり安全な仮定です。連絡先を処理する唯一の方法はコンパイラーが使用する(プライベート)ランタイム関数を使用することです。次に、コンパイラーは、このシナリオで呼び出しとパラメーターが正しいことを確認する必要があります。したがって、ユーザー定義のアクセサーは、標準のobjcランタイムアトミックコントラクトを満たすことが保証されていません。

于 2012-05-16T13:07:39.700 に答える
1

@synthesizeこれらのプロパティのを削除します。彼らはget/setを提供しました。

編集:明確にするために。.hで、acceptableStatusCodesを次のように宣言します

NSIndexSet *        _acceptableStatusCodes;

@property (copy,   readwrite) NSIndexSet *          acceptableStatusCodes;

次に、.mで、彼らは持っています

@synthesize acceptableStatusCodes = _acceptableStatusCodes;

- (NSIndexSet *)acceptableStatusCodes
{
    return [[self->_acceptableStatusCodes retain] autorelease];
}

- (void)setAcceptableStatusCodes:(NSIndexSet *)newValue
{
    if (self.state != kQRunLoopOperationStateInited) {
        assert(NO);
    } else {
        if (newValue != self->_acceptableStatusCodes) {
            [self willChangeValueForKey:@"acceptableStatusCodes"];
            [self->_acceptableStatusCodes autorelease];
            self->_acceptableStatusCodes = [newValue copy];
            [self didChangeValueForKey:@"acceptableStatusCodes"];
        }
    }
}

これらの2つのブロック(合成とメッセージの実装)は両方とも同じメッセージを定義しているため、競合しています。setメッセージは、最初に自動生成された合成が実行しない追加のチェック(kQRunLoopOperationStateInitedのチェック)を実行するため、とにかく無視されている合成を削除します。

セットメッセージは、コピーセマンティクスを正しく実装しています。

 self->_acceptableStatusCodes = [newValue copy];

そして、それは古い値を解放します。また、keyValue変更通知も行います。なぜ彼らが合成に残ったのかわかりません-彼らは後で状態チェックを望んでいたようで、自動生成されたget/setを削除するのを忘れていたようです。

于 2012-05-16T13:01:31.543 に答える