委托不存在,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。