我对一个我根本无法理解的问题感到疯狂! 我有一个NSDictionary(名为'headers'),NSString对象作为值。在这个字典中存储了从HTTP响应中获得的头字段。
我需要使用此代码
向此字典发送消息NSString* cacheControlString = [headers valueForKey:@"Cache-Control"]
此消息是在一个被调用三次的方法内发送的...我所拥有的是第一次和第二次消息返回正确的值。第三次SOMETIMES它没有返回正确的值,而调试器说的是关于cacheControlString
@<variable is not a NSString>
但为什么?!?!为什么不总是? 那个方法不会修改字典,因为它看不到字典! 为了确保我对该字典有完全控制权,我将响应返回的标题复制到我创建的另一个字典中。
另一件奇怪的事情是,如果我写这段代码:
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:让它返回简单的YES我没有问题...但是为什么? Header和HeaderElement类不适用于字典!
正如您所看到的,没有人更改“标题”字典,您可以确保字典中的值在我使用它时不会自动释放...