如果从AppStore下载,我的应用程序会在加载网页时频繁崩溃,但我无法在调试模式下重复崩溃。崩溃日志说:
-[NSURLResponse allHeaderFields]: unrecognized selector sent to instance 0x1590902e0
但我确信我的代码中没有“allHeaderFields”调用。
我编写了自定义url缓存来将html和js缓存到磁盘。这可能会导致错误,但我无法找到它。
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request {
...here is some code not important
NSString *versionUrl = [self versionUrl:url];
NSString *fileName = [self cacheRequestFileName:versionUrl];
NSString *otherInfoFileName = [self cacheRequestOtherInfoFileName:versionUrl];
NSString *filePath = [self cacheFilePath:fileName];
NSString *otherInfoPath = [self cacheFilePath:otherInfoFileName];
NSDate *date = [NSDate date];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:filePath]) {
BOOL expire = false;
NSDictionary *otherInfo = [NSDictionary dictionaryWithContentsOfFile:otherInfoPath];
if (self.cacheTime > 0) {
NSInteger createTime = [[otherInfo objectForKey:@"time"] intValue];
if (createTime + self.cacheTime < [date timeIntervalSince1970]) {
expire = true;
}
}
if (expire == false) {
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSURLResponse *response = [[NSURLResponse alloc] initWithURL:request.URL
MIMEType:[otherInfo objectForKey:@"MIMEType"]
expectedContentLength:data.length
textEncodingName:[otherInfo objectForKey:@"textEncodingName"]];
NSCachedURLResponse *cachedResponse = [[[NSCachedURLResponse alloc] initWithResponse:response data:data] autorelease];
[response release];
return cachedResponse;
} else {
[fileManager removeItemAtPath:filePath error:nil];
[fileManager removeItemAtPath:otherInfoPath error:nil];
}
}
__block NSCachedURLResponse *cachedResponse = nil;
//sendSynchronousRequest请求也要经过NSURLCache
id boolExsite = [self.responseDictionary objectForKey:url];
if (boolExsite == nil) {
[self.responseDictionary setValue:[NSNumber numberWithBool:TRUE] forKey:url];
__block CustomURLCache *weakSelf = self;
[NSURLConnection sendAsynchronousRequest:request queue:[[[NSOperationQueue alloc] init] autorelease] completionHandler:^(NSURLResponse *response, NSData *data,NSError *error)
{
[weakSelf.responseDictionary removeObjectForKey:url];
if (error) {
cachedResponse = nil;
}else if(data){
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%f", [date timeIntervalSince1970]], @"time",
response.MIMEType, @"MIMEType",
response.textEncodingName, @"textEncodingName", nil];
[dict writeToFile:otherInfoPath atomically:YES];
[data writeToFile:filePath atomically:YES];
cachedResponse = [[[NSCachedURLResponse alloc] initWithResponse:response data:data] autorelease];
}
}];
return cachedResponse;
}
return nil;
}
这是崩溃线程日志:
CoreFoundation 0x182154f74 ___exceptionPreprocess (in CoreFoundation) + 148
libobjc.A.dylib 0x196c5bf80 objc_exception_throw
CoreFoundation 0x18215bc6c ___methodDescriptionForSelector (in CoreFoundation) + 0
CoreFoundation 0x182158c14 ____forwarding___ (in CoreFoundation) + 872
CoreFoundation 0x18205cdcc __CF_forwarding_prep_0 (in CoreFoundation) + 92
myappname 0x100566a9c _isCacheValid + 152
myappname 0x100567ca4 -[_priv_NBSURLProtocol startLoading] + 368
CFNetwork 0x18194fda8 ____ZN19URLConnectionLoader27_private_ScheduleOriginLoadEPK12NSURLRequestPK20_CFCachedURLResponse_block_invoke_2 (in CFNetwork) + 72
CFNetwork 0x181843ca0 ____ZNK19URLConnectionLoader25withExistingProtocolAsyncEU13block_pointerFvP11URLProtocolE_block_invoke (in CFNetwork) + 32
libdispatch.dylib 0x197455770 <redacted>
libdispatch.dylib 0x19745ea54 <redacted>
CFNetwork 0x181843c70 __ZN19RunloopBlockContext13_invoke_blockEPKvPv (in CFNetwork) + 36
CoreFoundation 0x1820387ec _CFArrayApplyFunction (in CoreFoundation) + 68
CFNetwork 0x181843b54 __ZN19RunloopBlockContext7performEv (in CFNetwork) + 136
CFNetwork 0x181843a14 __ZN17MultiplexerSource7performEv (in CFNetwork) + 312
CFNetwork 0x181843840 __ZN17MultiplexerSource8_performEPv (in CFNetwork) + 68
CoreFoundation 0x18210c5a4 ___CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ (in CoreFoundation) + 24
CoreFoundation 0x18210c038 ___CFRunLoopDoSources0 (in CoreFoundation) + 540
CoreFoundation 0x182109d38 ___CFRunLoopRun (in CoreFoundation) + 724
CoreFoundation 0x182038dc0 _CFRunLoopRunSpecific (in CoreFoundation) + 384
WebCore 0x193cab2c8 <redacted>
JavaScriptCore 0x18377b4e4 __ZN3WTFL16threadEntryPointEPv (in JavaScriptCore) + 212
JavaScriptCore 0x18377b3f4 __ZN3WTFL19wtfThreadEntryPointEPv (in JavaScriptCore) + 24
libsystem_pthread.dylib 0x19766bb3c <redacted>
libsystem_pthread.dylib 0x19766baa0 <redacted>
libsystem_pthread.dylib 0x197669030 thread_start
答案 0 :(得分:1)
尝试用NSHTTPURLResponse替换NSURLResponse:
NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:request.URL
statusCode:200
HTTPVersion:@"1.1"
headerFields:nil];
NSCachedURLResponse *cachedResponse = [[[NSCachedURLResponse alloc] initWithResponse:urlresponse data:data] autorelease];
[response release];
return cachedResponse;