崩溃 - [NSURLResponse allHeaderFields]

时间:2015-11-10 10:20:04

标签: ios objective-c crash

如果从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

1 个答案:

答案 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;