【发布时间】: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