2011-05-19 57 views
0

我已經有了對象下面(的相關部分):EXC_BAD_ACCESS在會話超時使用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方法中將代理設置爲零,將它們自己設置爲委託。我應該使用retain而不是assign

我在做別的東西顯然不對嗎?

感謝您的閱讀。

回答

1

當您嘗試訪問過度釋放的對象時,通常會發生EXC_BAD_ACCESS。在這種情況下,它是伊瓦爾delegate。要麼你沒有設置任何值,要麼沒有保留該對象。請注意,釋放的對象不是零,除非將它設置爲零,所以即使它有一個值,它也將是一個隨機存儲器值,除了設置值之外,您不應該觸摸它。