1

NSErrorオブジェクトを返すときに問題が発生します。オブジェクトにアクセスするためのコードの最初の行(この場合、NSLogを挿入しました)により、「EXC_BAD_ACCESS」が発生します。

これは、NSErrorオブジェクトを明示的に作成しているのではなく、NSURLRequestからオブジェクトを取得して返すためですか?この特定の関数(downloadFile :)では、他の関数から取得したいエラーがいくつかありますが、関数内の他の2つの機会にNSErrorを作成します。

どんな助けでも大歓迎です。

問題のあるコードは次のとおりです。

-(void)someCode {
NSError *err = nil;

localPool = [[NSAutoreleasePool alloc] init];

if (!iap) {
    iap = [[InAppPurchaseController alloc] init];
}

if (![self.iap downloadFile:@"XXXXX.plist" withRemoteDirectory:nil withLocalDelete:YES withContentType:@"text/xml" Error:&err] ) {
    //"EXC_BAD_ACCESS" on calling NSLog on the next line? 
    NSLog(@"Error downloading Plist: %@", [err localizedDescription]);

    [self performSelectorOnMainThread:@selector(fetchPlistFailed:) withObject:err waitUntilDone:NO];
    [localPool drain], localPool = nil;
    return NO;
}
//Removed the remainder of the code for clarity.

[localPool drain], localPool = nil;
return YES;
}


-(BOOL)downloadFile:(NSString *)fileName
withRemoteDirectory:(NSString *)remoteDirectory
 withLocalDelete:(BOOL)withLocalDelete
 withContentType:(NSString *)contentTypeCheckString
     Error:(NSError **)error {

UIApplication *app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES; 

NSError *localError = nil;

NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];

NSString *urlString = [NSString stringWithFormat:@"http://XXXXX/%@", fileName];

NSLog(@"Downloading file: %@", urlString);

NSURL *url = [NSURL URLWithString:urlString];

NSURLRequest *req = [[NSURLRequest alloc] initWithURL:url];

NSHTTPURLResponse *response = nil;

NSData *responseData = [NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&localError];

[req release];

if (response == nil || localError) {
    NSLog(@"Error retrieving file:%@", [localError localizedDescription]);
    if (error != NULL) {
        *error = localError;
        //THIS NSLog call works just fine.
        NSLog(@"Error copied is:%@", [*error localizedDescription]);
    }
 [localPool drain], localPool = nil;
 app.networkActivityIndicatorVisible = NO; 
 return NO;
}

//Rest of function omitted for simplicity.
}
4

1 に答える 1

3

私はあなたのNSErrorオブジェクトがautoreleasedであり、あなたのに置かれていると思いますlocalPool。あなたはそれを排出しlocalPool、こうしてを破壊しましたNSError

あなたは本当にlocalPoolすべての方法で必要ですか?そうでない場合は、を削除してlocalPoolください。

また、を排出するのを忘れたようlocalPoolですsomeCode。うまくいけば、あなたはそれをコピーしなかっただけです...

-(void)someCode {
    NSError *err = nil;

    localPool = [[NSAutoreleasePool alloc] init];

    if (!iap) {
        iap = [[InAppPurchaseController alloc] init];
    }

    if (![self.iap downloadFile:@"XXXXX.plist" withRemoteDirectory:nil withLocalDelete:YES withContentType:@"text/xml" Error:&err] ) {
             ....
            [localPool drain], localPool = nil;
            return NO;
    }
    [localPool drain], localPool = nil; // missing
}
于 2010-12-03T04:16:58.393 に答える