我对一个我根本无法理解的问题发疯了!我有一个以 NSString 对象为值的 NSDictionary(名为“标题”)。在这个字典中存储了从 HTTP 响应中获得的头字段。
我需要使用此代码向此字典发送消息
NSString* cacheControlString = [headers valueForKey:@"Cache-Control"]
这条消息在一个被调用三次的方法中发送......我所拥有的是第一次和第二次消息返回一个正确的值。第三次有时它没有返回正确的值,并且调试器说关于 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: 让它简单地返回是的,我没有问题......但是为什么?Header 和 HeaderElement 类不适用于字典!
如您所见,没有人更改“标题”字典,并且您可以确定字典中的值在我使用它时不会自动释放...