2

以下のサンプル コードを iPhone シミュレーターで実行しても問題ありませんが、iPhone で実行すると、[asiRequest cancel] を呼び出すと常に EXC_BAD_ACCESS が返されます。誰でも助けることができますか?ありがとう。

ASIHTTPRequest *asiRequest;

-(IBAction)request1{
    NSLog(@"request starting");
    [self sendRequest];
}
-(IBAction)cancel1{
    NSLog(@"request caceling");
    if(asiRequest)
        [asiRequest cancel];

}

-(void)sendRequest{
    asiRequest=[ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://maps.google.com/"]];
    [asiRequest setDelegate:self];
    [asiRequest startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
    NSLog(@"requestFinished");
    asiRequest=nil;
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
    NSLog(@"request Error=%@",[request error]);
    asiRequest=nil;
}

APIを確認したところ、requestFinishedやrequestFailedで解放すべきではないと思う

終了時にどのように解放できますか?

- (void)cancel
{
    #if DEBUG_REQUEST_STATUS
    NSLog(@"Request cancelled: %@",self);
    #endif
    [[self cancelledLock] lock];

    if ([self isCancelled] || [self complete]) {
        [[self cancelledLock] unlock];
        return;
    }

    [self failWithError:ASIRequestCancelledError];
    [self setComplete:YES];
    [self cancelLoad];
    [[self cancelledLock] unlock];

    // Must tell the operation to cancel after we unlock, as this request might be dealloced and then NSLock will log an error
    [super cancel];
}
4

2 に答える 2

9

ASIHTTPRequest を保持する必要があります。リクエストは便利なコンストラクターを使用して自動解放されたため、現在の実行ループの最後を過ぎても保持できるように保持する必要があります。

さらに、asiRequestis not nilinかどうかをチェックする必要がないことに注意してくださいcancel1:: nil にメッセージを送信しても何も起こらず、悪影響もありません。

于 2010-01-25T00:37:42.550 に答える
1

コードを再度変更しました

今は問題なく動作しています。心配する必要があるのは、requestFailed が予期せず発生した場合に、どこかでリクエストを解放する必要があることだけだと思います

-(IBAction)request1{
    NSLog(@"request starting");
    [self sendRequest];
}
-(IBAction)cancel1{
    NSLog(@"request caceling");
    if(asiRequest){
        [asiRequest cancel];
        [asiRequest release];
        asiRequest=nil;
    }
}

-(void)sendRequest{

    asiRequest=[[ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://maps.google.com/"]] retain];
    [asiRequest setDelegate:self];
    [asiRequest startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
    NSLog(@"requestFinished");
    [asiRequest release];
    asiRequest=nil;
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
    NSLog(@"request Error=%@",[request error]);
}
于 2010-01-25T03:29:57.123 に答える