0

我对一个我根本无法理解的问题发疯了!我有一个以 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 类不适用于字典!

如您所见,没有人更改“标题”字典,并且您可以确定字典中的值在我使用它时不会自动释放...

4

0 回答 0