过程:
- 应用程序位于主视图 Controller 上,正在请求 API 上的数据以设置 NSObject 属性。请求正在私有(private)方法上处理。
- 用户将 View Controller 更改为第二个 View Controller (请求仍在异步处理)
- 加载第二个 View Controller
- 请求结束,应用在设置对象属性时返回 EXC_BAD_ACCESS
对象似乎没有正确的内存访问。
我希望用户可以切换 View Controller ,即使有待处理的请求,应用程序也不会崩溃。
我不想在加载期间在 View Controller 上阻止用户。
User.h
@interface User : NSObject
[...]
@property (nonatomic) NSString *notification;
[...]
-(void) methodName;
@end
用户.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 中,然后删除 User *user;
在 MyController.m 中。用户没有被释放,也没有崩溃。
最佳答案
- 验证
[dict objectForKey:@"infos"]
不是NSNull
- 崩溃 可以在这里。 - 其他代码看起来没问题。
- 同时将
-(void)dealloc
添加到您的对象中并放置一个 断点在那里验证对象没有被释放 在作业之前。
关于ios - 设置 NSObject 属性 - EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31002953/