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