2015-06-23 2 views
1

Процесс:Набор NSObject свойство - EXC_BAD_ACCESS

  • приложение на контроллере домашнего просмотра и запрашивает данные по 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 

EDIT:

Я просто положить @property (nonatomic) User *user; в MyController.h и удалить User *user; в MyController.m. Пользователь не освобождается и нет сбоя.

+0

Проверьте, что объект класса жив или нет. –

+1

Какая линия фактически вызывает крушение? Я не вижу ничего, что было объявлено как «NSObject». Этот вопрос нуждается в большом разъяснении. – nhgrif

+0

Я добавил код и строку, вызвавшую сбой – Thlbaut

ответ

1
  • Убедитесь, что [dict objectForKey:@"infos"] не NSNull - Краш может быть здесь.
  • Другой код выглядит нормально.
  • добавить Также -(void)dealloc к объекту и поставить точку останова там, чтобы убедиться, что объект не будет выпущен перед тем уступки.
+0

Вы правы, объект освобождается до назначения. Есть ли способ решить проблему сейчас? – Thlbaut

+0

Без кода, в котором вы выделяете этот объект и выполняете вызовы, невозможно предложить решение – Misha

+0

@Thlbaut, пожалуйста, посмотрите мой ответ, я описал, как управлять этой проблемой – Doro

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 приведет к падению. См. Ошибку для получения дополнительной информации.

+0

Нет проблем с JSON, проблема с памятью. Thx для вашего ответа – Thlbaut

0

Обычно этот типа ошибки появляется, когда освобождаться объект, но ваш код пытается получить доступ к нему в данном так, прежде всего, проверить, как вы держите объект пользователя в памяти, бросать, например, свойство:

@property (nonatomic, strong) User *u; 

и убедитесь, что он все еще находится в памяти, когда операция завершена:

Надеется, что это поможет.

+0

Это совершенно неправильно. – Eiko

+0

Как проверить, сохраняется ли объект в памяти при завершении операции? – Thlbaut

+0

@Eiko, что именно неправильно? может отредактировать мой ответ. Но технически, если мы отправили сообщение на освобожденный объект, это может вызвать такую ​​проблему, не так ли? – Doro

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, уведомления, и я. Из этого вытекает догадки. Прямо сейчас вы даже не знаете, какое из этих трех назначений идет не так.

И так как у вас есть много строк кода, которые, на ваш взгляд, свободны и не имеют значения, вероятность того, что фактическая ошибка скрывается где-то в этих строках. Помните: в вашем коде есть ошибка. Предполагая, что любой из вашего кода является ошибкой, глупо, потому что вы уже знаете, что это не так!

Смежные вопросы