1

NSURLConnectionの使用の指示に従いましたが、プロジェクトがメソッドでクラッシュすることがあります(非常にまれです)。

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [connection release];
    [myNSMutableData release];
}

を解放しようとするとクラッシュしNSMutableDataます。なぜクラッシュするのか知りたい!

私が使用するいくつかのコード:

- (void) start
{
    while (1)
    {
        NSString *stringURL = @"http://www.iwheelbuy.com/get.php?sex=1";
        NSURL *url = [NSURL URLWithString:stringURL];
        NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
        NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
        if (connection)
        {
            getData = [[NSMutableData data] retain];
            break;
        }
        else
        {
            NSLog(@"no start connection");
        }
    }
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    if ([connection.originalRequest.URL.absoluteString rangeOfString:@"get.php"].location != NSNotFound)
    {
        [getData setLength:0];
    }
}

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    if ([connection.originalRequest.URL.absoluteString rangeOfString:@"get.php"].location != NSNotFound)
    {
        [connection release];
        [getData release];
    }
}

- (void) connectionDidFinishLoading:(NSURLConnection *)connection
{
    if ([connection.originalRequest.URL.absoluteString rangeOfString:@"get.php"].location != NSNotFound)
    {
        [connection release];
        NSString *html = [[NSString alloc] initWithData:getData encoding:NSASCIIStringEncoding];
        [getData release];
        if ([html rangeOfString:@"id1="].location != NSNotFound && [html rangeOfString:@"id2="].location != NSNotFound)
        {
            NSLog(@"everything is OKAY");
            [html release];
        }
        else
        {
            [html release];
            [self start];
        }
    }
}
4

2 に答える 2

1

コードは非同期呼び出しを実行しています。startメソッドを呼び出すたびに、NSURLConnectionオブジェクトの新しいインスタンスを作成しますが、データ用のオブジェクト(getData)は1つだけです。2つの同時呼び出しがあり、最初の呼び出しが失敗すると接続とgetDataオブジェクトが解放され、2番目の呼び出しが失敗すると接続オブジェクトが正常に解放されますが、getDataオブジェクトは前の失敗呼び出しですでに解放されているため、コードがクラッシュします。

これを修正するには、オブジェクトを解放した後、常にオブジェクトをnilに設定し、必要に応じてnilチェックを実行します。

于 2012-05-13T09:01:39.367 に答える
0

getDataの代わりにリリースする必要がありmyNSMutableDataます。

于 2012-05-13T07:34:50.560 に答える