我有以下(对象的相关部分)对象:
#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
吗?
我在做其他明显不对的事吗?
感谢阅读。
答案 0 :(得分:1)
当您尝试访问过度释放的对象时,通常会发生EXC_BAD_ACCESS。在这种情况下,它是delegate
ivar。您没有设置任何值,或者没有保留对象。请注意,释放的对象不是nil,除非您将其设置为nil,因此即使它具有值,它也将是一个随机内存值,除了设置值之外,您不应触摸它。