委托不存在,EXC_BAD_ACCESS

我有一个TableViewController运行时,使另一个类的实例,并与它调用JSON例如。

TableViewController;

-(void)viewDidLoad{ JSONClass *jc = [[JSONClass alloc]init]; jc.JSONClassDelegate = (id)self; [jc view]; } 

JSONClass将继续从Web中检索数据,一旦完成,将向tableViewController发送委托方法调用“JSONClassDataReceived”。 如,

JSONClass;

 -(void)viewDidLoad{ //codes of URL connection goes here... NSMutableURLRequest *request = [[NSMutableURLRequest new]; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; [self performSelectorOnMainThread:@selector(fetchedData:) withObject:responseData waitUntilDone:YES]; } - (void)fetchedData:(NSData *)responseData { NSMutableDictionary *data = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error]; if (JSONPromotionsLocationsDelegate && [JSONPromotionsLocationsDelegate respondsToSelector:@selector(JSONPromotionsLocationsDataReceived)]) { [JSONPromotionsLocationsDelegate JSONPromotionsLocationsDataReceived]; } } 

TableViewController;

 - (void)JSONClassDataReceived{ [tableView reloadTable]; } 

在哪些相关数据被填充之后。

如何在TableViewController上按下后退button时停止JSONClass,然后在我的tableViewController上调用委托方法JSONClassDataReceived?

我试过了

 jc.JSONClassDelegate = nil; jc = nil; 

当按下后退button,但我的应用程序崩溃,因为JSONClass已达到JSONClassDelegate,因此无法find方法 – (void)JSONClassDataReceived由于tableViewController视图不再存在的事实。 我也试过在JSONClass中实现dealloc。 似乎没有工作。

 - (void)dealloc{ self.view = nil; } 

我有错误EXC_BAD_ACCESS就行了,

 if (JSONPromotionsLocationsDelegate && [JSONPromotionsLocationsDelegate respondsToSelector:@selector(JSONPromotionsLocationsDataReceived)]) { [JSONPromotionsLocationsDelegate JSONPromotionsLocationsDataReceived]; } 

我似乎已经修复了简单的设置我的委托,而不是分配的崩溃。

紧急

 @property (nonatomic, assign)id <JSONClassDelegate> JSONClassDelegate; 

没有崩溃

 @property (nonatomic, weak)id <JSONClassDelegate> JSONClassDelegate; 

在向Stack Overflow发布有关崩溃的问题时,包含崩溃日志或堆栈跟踪以帮助您的同事帮助您解决问题很有帮助。

解决EXC_BAD_ACCESS崩溃问题的正确方法是使用“ 乐器”的 “ 僵尸”乐器 。 这会告诉你究竟是什么原因造成这个问题。

没有这些信息,我们只能猜测。

但就你而言,我可以采取一个有教养的猜测。 您的委托正在被释放,在此之后,您正试图使用​​释放的内存。 这很可能是因为你没有宣布这个代表是一个弱点。 这在文档中的几处特别提到。

首先,宣布你的代表是一个弱财产。

@property (nonatomic, weak) id JSONClassDelegate;

不要忘了综合它。 不合成属性会导致不好的事情。

现在在调用委托的方法中,应该使其成为方法持续时间的强有力的参考。 这可以防止它在使用时被释放。 例如:

 __strong id aDelegate = [self JSONClassDelegate]; if ([JSONClassDelegate respondsToSelector:@selector(JSONPromotionsLocationsDataReceived)]) { [JSONClassDelegate JSONPromotionsLocationsDataReceived]; } 

这会创build一个强大的本地堆栈variables,指向您的弱引用。 它将被保留,直到超出范围。

首先,确保在调用你的委托之前,你这样做:

 if (self.delegate && [self.delegate respondsToSelector:@selector(JSONClassDataReceived)]) { [self.delegate JSONClassDataReceived]; } 

除此之外,在你的JSONClass' - (void)dealloc方法中,你可以停止networking调用。 如果您使用ARC,请确保您不要调用[super dealloc] 。 对于要调用的dealloc方法,您需要保留jc对象的空值。

希望这可以帮助。

不,你不能(有用地)“testing一个地址是否包含有效的对象”。 即使你能够在内存分配系统的内部进行修改,并确定你的地址指向了一个有效的对象,这并不一定意味着它是你以前所指的同一个对象:对象可能已经解除分配,并在同一个内存地址创build另一个对象。

从这里find。