全然わからない問題で頭がおかしくなっちゃう!値として 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 クラスはディクショナリでは機能しません!
ご覧のとおり、誰も「ヘッダー」辞書を変更しておらず、作業中に辞書内の値が自動解放されていないことを確認できます...