Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSDictionary和NSString,一些消息返回一个奇怪的值_Ios_Objective C_Nsstring_Nsdictionary - Fatal编程技术网

Ios NSDictionary和NSString,一些消息返回一个奇怪的值

Ios NSDictionary和NSString,一些消息返回一个奇怪的值,ios,objective-c,nsstring,nsdictionary,Ios,Objective C,Nsstring,Nsdictionary,我为一个我根本无法理解的问题而发疯! 我有一个NSDictionary(名为“headers”),其中NSString对象作为值。此字典中存储了从HTTP响应获取的头字段 我需要用此代码向此词典发送消息 NSString* cacheControlString = [headers valueForKey:@"Cache-Control"] 此消息在一个被调用三次的方法中发送。。。我得到的是,第一次和第二次消息返回正确的值。第三次,有时它不会返回正确的值,调试器会说关于cacheControl

我为一个我根本无法理解的问题而发疯! 我有一个NSDictionary(名为“headers”),其中NSString对象作为值。此字典中存储了从HTTP响应获取的头字段

我需要用此代码向此词典发送消息

NSString* cacheControlString = [headers valueForKey:@"Cache-Control"]
此消息在一个被调用三次的方法中发送。。。我得到的是,第一次和第二次消息返回正确的值。第三次,有时它不会返回正确的值,调试器会说关于cacheControlString

@<variable is not a NSString>
它总是返回正确的值。。。 有人有这种问题吗?!我真的快疯了

以下是完整的代码: Header和HeaderElement是我创建的类,它们有助于处理Header,但只处理传递的NSString对象。 checkCacheControlElementForElement:inHeader:方法所做的只是搜索标头中是否有元素

我已经看到,如果我删除方法checkCacheControlElementForElement:inHeaders:的第二行,让它简单地返回YES,我就没有问题了。。。但是为什么呢?Header和HeaderElement类不能与字典一起使用


正如您所看到的,没有人更改“headers”字典,您可以确保字典中的值在我使用它时不会自动删除…

谁调用checkCacheControlElementForElement:inHeader:method?也许当它第三次被调用时,它实际上收到了一个修改过的字典?您可以添加显示谁实际调用此方法的代码段吗?该方法仅由checkCacheControlElementForElement:inHeaders:调用。。。我正在添加该方法的代码,尝试通过NSLog(而不是调试器)在控制台中编写这些值,并告诉我们发生了什么。这种奇怪的行为听起来像是内存问题。您是否尝试过在启用僵尸对象的情况下运行,或者完全迁移到ARC?我猜headers对象已经被释放,并且正在重新分配。或者headers对象中的string对象已被释放并正在重新分配。
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;
}