0

全然わからない問題で頭がおかしくなっちゃう!値として NSString オブジェクトを持つ NSDictionary (「ヘッダー」という名前) があります。このディクショナリには、HTTP 応答から取得したヘッダー フィールドが格納されます。

このコードでこの辞書にメッセージを送信する必要があります

NSString* cacheControlString = [headers valueForKey:@"Cache-Control"]

このメッセージは、3回呼び出されるメソッド内で送信されます...私が持っているのは、メッセージが1回目と2回目で正しい値を返すことです。3回目は正しい値を返さない場合があり、デバッガーはcacheControlStringについて言います

@<variable is not a NSString>

しかし、なぜ?!?!なぜいつもではないのですか?このメソッドは辞書を参照できないため、辞書を変更しません。そのディクショナリを完全に制御できるようにするために、応答によって返されたヘッダーを、私が作成した別のディクショナリにコピーしました。

もう1つの奇妙なことは、このコードを書くと:

NSString* cacheControlString = [headers valueForKey:@"Cache-Control"];
cacheControlString = [headers valueForKey:@"Cache-Control"];
cacheControlString = [headers valueForKey:@"Cache-Control"];
cacheControlString = [headers valueForKey:@"Cache-Control"];
cacheControlString = [headers valueForKey:@"Cache-Control"];
cacheControlString = [headers valueForKey:@"Cache-Control"];
cacheControlString = [headers valueForKey:@"Cache-Control"];

それは常に正しい値を返します...誰かがこの種の問題を抱えていましたか?! 私は本当に夢中になります!

完全なコードは次のとおりです。

- (void) firstMethod {
    BOOL mustRevalidate = [self checkCacheControlElementForElement:@"must-revalidate" inHeaders:[response headers]];
    BOOL publicResponse = [self checkCacheControlElementForElement:@"public" inHeaders:[response headers]];
    BOOL privateResponse = [self checkCacheControlElementForElement:@"private" inHeaders:[response headers]];
}

- (BOOL) checkCacheControlElementForElement:(NSString*)element inHeaders:(NSDictionary*)headers {
    NSString* cacheControlString = [headers valueForKey:@"Cache-Control"];
    return [self checkCacheControlElementForElement:element inHeader:cacheControlString];
}

- (BOOL) checkCacheControlElementForElement:(NSString*)element inHeader:(NSString*)headerString {
    if (!headerString)
        return NO;

    Header* header = [[Header alloc] initWithName:@"Cache-Control" andValue:headerString];
    for (HeaderElement* headerElement in [header elements]) {
        if ([[headerElement name] isEqualToString:element]) {
            [header release];
            return YES;
        }
    }
    [header release];
    return NO;
}

Header と HeaderElement は、ヘッダーの操作に役立つ私が作成したクラスですが、渡された NSString オブジェクトでのみ機能します。checkCacheControlElementForElement:inHeader: メソッドが行うことは、ヘッダーに要素があるかどうかを検索することだけです。

メソッド checkCacheControlElementForElement:inHeaders: の 2 行目を削除すると、単純に YES を返すようにすると、問題はありません...しかし、なぜですか? Header および HeaderElement クラスはディクショナリでは機能しません!

ご覧のとおり、誰も「ヘッダー」辞書を変更しておらず、作業中に辞書内の値が自動解放されていないことを確認できます...

4

0 に答える 0