【问题标题】:EXC_BAD_ACCESS in session timeout using ASIHTTPRequest使用 ASIHTTPRequest 的会话超时中的 EXC_BAD_ACCESS
【发布时间】:2011-05-19 16:13:15
【问题描述】:

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

#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 吗?

我在这里做其他明显错误的事情吗?

感谢阅读。

【问题讨论】:

    标签: iphone delegates protocols asihttprequest


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 2010-10-13
      相关资源
      最近更新 更多