设置NSObject属性 - EXC_BAD_ACCESS

时间:2015-06-23 12:33:45

标签: ios objective-c exc-bad-access nsobject

流程:

  • App位于主视图控制器上,并且正在请求API上的数据以设置NSObject属性。该请求正在处理私有方法。
  • 用户将视图控制器更改为第二个视图控制器(请求仍在异步处理)
  • 第二个视图控制器已加载
  • 请求结束,应用程序在设置对象属性时返回EXC_BAD_ACCESS

似乎对象没有正确的内存访问权。

我希望用户可以切换视图控制器,即使有待处理的请求,并且应用程序也不会崩溃。

我不想在加载过程中阻止视图控制器上的用户。

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;。用户未被解除分配且没有崩溃。

4 个答案:

答案 0 :(得分:1)

  • 确认NSNull不是-(void)dealloc - 崩溃 可以在这里。
  • 其他代码看起来不错。
  • 同时将{{1}}添加到您的对象并添加一个 断点那里验证对象没有被释放 之前作业。

答案 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的,那就是愚蠢的,因为你已经知道它不是!