使用ASIHTTPRequest在会话超时中使用EXC_BAD_ACCESS

时间:2011-05-19 16:13:16

标签: iphone delegates protocols asihttprequest

我有以下(对象的相关部分)对象:

#import "HTTPHelper.h"

#define TIME_OUT_SECONDS 30
@interface HTTPHelper (Private)
- (ASIHTTPRequest *)sendRequest:(ASIHTTPRequest *)request error:(NSMutableArray*)error;
@end

@implementation HTTPHelper
@synthesize delegate;

- (void) invokeSessionTimeout {
    [ASIHTTPRequest clearSession];
    if ( delegate != nil ) {
        [delegate sessionTimedOut];
    }
}

- (ASIHTTPRequest *)sendRequest:(ASIHTTPRequest *)request error:(NSMutableArray*)error {

    if ( request == nil ) {
        return  nil;
    }

    [request setTimeOutSeconds:TIME_OUT_SECONDS];
    [request setValidatesSecureCertificate:NO];
    [request startSynchronous];

    if ( [request responseStatusCode] == 0 ) {
        return nil;
    }

    if ([request responseStatusCode] < 200 || [request responseStatusCode] >= 400) { 
        if ( [request responseStatusCode] == 403 && [error count] == 0 && delegate != nil ) {
            NSLog(@"session has timed out.");
            // CRASH HAPPENS HERE:
            [self performSelectorOnMainThread:@selector(invokeSessionTimeout) withObject:nil waitUntilDone:YES];
            return nil;
        }
    }

    return request;
}
@end

这是标题:

#import "ASIHTTPRequest.h"

@protocol HTTPHelperDelegate
- (void) sessionTimedOut;
@end

@interface HTTPHelper : NSObject {
    id<HTTPHelperDelegate> delegate;
}

@property (nonatomic, assign) id<HTTPHelperDelegate> delegate;
@end

它在performSelectorOnMainThread电话的线路上崩溃了。我一开始认为这是问题所在,因为这是在主线程上发生的,但文档说你应该使用这个方法,如果你不知道什么线程会调用你的方法,所以不应该这样

我一直在努力确保委托是指向我对象的指针。这显然不是零,(也不是假的)。当我崩溃并将鼠标悬停在委托上时,它会显示“struct objc_object * delegate 0x65696d0”...但是当我在调试器中打印该对象时,它说“0x65696d0似乎没有指向有效对象。”

我在两个视图控制器的viewDidUnload方法中将委托设置为nil,这两个视图控制器将自己设置为委托。我应该使用retain代替assign吗?

我在做其他明显不对的事吗?

感谢阅读。

1 个答案:

答案 0 :(得分:1)

当您尝试访问过度释放的对象时,通常会发生EXC_BAD_ACCESS。在这种情况下,它是delegate ivar。您没有设置任何值,或者没有保留对象。请注意,释放的对象不是nil,除非您将其设置为nil,因此即使它具有值,它也将是一个随机内存值,除了设置值之外,您不应触摸它。