流程:
似乎对象没有正确的内存访问权。
我希望用户可以切换视图控制器,即使有待处理的请求,并且应用程序也不会崩溃。
我不想在加载过程中阻止视图控制器上的用户。
User.h
@interface User : NSObject
[...]
@property (nonatomic) NSString *notification;
[...]
-(void) methodName;
@end
User.m
-(void) methodName{
//there is code around but useless for this problem
[...]
NSError *error;
NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
self.notification = [[dict objectForKey:@"infos"] objectForKey:@"notification"]; //Here is the EXC_BAD_ACCESS
[...]
}
MyController.m
@interface MyController ()
@end
User *user;
@implementation HomeCVViewController
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:YES];
user = [User new];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[user someMethod];
dispatch_async(dispatch_get_main_queue(), ^{
[...]//some code
});
});
}
@end
编辑:
我只是将@property (nonatomic) User *user;
放在MyController.h中并删除MyController.m中的User *user;
。用户未被解除分配且没有崩溃。
答案 0 :(得分:1)
NSNull
不是-(void)dealloc
- 崩溃
可以在这里。 答案 1 :(得分:0)
检查NSError
NSError *error;
NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSLog(@"%@", error.localizedDescription); <----- HERE
self.notification = [[dict objectForKey:@"infos"] objectForKey:@"notification"];
当您尝试从/转换为JSON时,不正确的JSON结构将导致其崩溃。有关详细信息,请参阅错误。
答案 2 :(得分:0)
通常,当对象被释放但是您的代码尝试访问它的数据时会出现这种类型的错误 所以,首先,检查你如何在内存中保存你的用户实体,抛出,例如,属性:
@property (nonatomic, strong) User *u;
并确保操作完成时它仍然在内存中:
希望这会对你有所帮助。
答案 3 :(得分:0)
而不是
self.notification = [[dict objectForKey:@"infos"] objectForKey:@"notification"]; //Here is the EXC_BAD_ACCESS
写
NSDictionary* infoDict = dict [@"infos"];
id notification = infoDict [@"notification"];
self.notification = notification;
设置断点,并检查每个infoDict,notification和self。这需要猜测它。现在你甚至不知道这三个任务中哪一个出错了。
既然你有许多代码在你看来是无错误且不相关的,那么实际的bug隐藏在那些行中的某个地方的可能性很大。请记住:您的代码中存在错误。假设你的任何代码都是无bug的,那就是愚蠢的,因为你已经知道它不是!