2010-10-06 5 views
0

Я создаю/нажимаю свой ViewController, отображаю информацию и перехожу обратно в свой RootViewController. В то время как я перемещаюсь назад, аварийные ситуации приложения (EXC_BAD_ACCESS).SBJsonParser: приложение вылетает, если я не сохраняю возвращаемое значение

С помощью инструментов я узнал, что вызывается dealloc моего ViewController, который освобождает мой класс оболочки. В моем классе-оболочке также вызывается метод dealloc. Этот dealloc выпускает parsedJson (сохраненное свойство), и сразу приложение падает. Странно, что количество удержаний падает от 1 до -1, несмотря на наличие только malloc и выпуск.

Если я сохраню возвращенный результат parsedJson, приложение не падает, и я не нахожу утечки.

SBJsonParser *JSONParser = [SBJsonParser new]; 
id parsedJson = [[JSONParser objectWithString:jsonString error:NULL] retain]; 

Я не могу сделать освобождение/автоописание, потому что приложение снова потерпит крах.

С NSZombieEnabled я

* - [CFDictionary релиз]: сообщение, отправленное высвобождены например 0x6d51aa0

Я получаю это зомби после того, как я сделал изменения. Прежде чем я использовал свойство и построитель интерфейса для моего контроллера представления, и у меня не было сбоя, потому что контроллер представления не был немедленно выпущен. Теперь я делаю это:

MyViewController *myViewController = [[MyViewController alloc] init]; 
[[self navigationController] pushViewController:myViewController animated:YES]; 
[myViewController release]; 
myViewController = nil; 

Где ошибка? Я не могу сохранить parsedJSON без релиза. Я никогда не выпускаю parsedJson, за исключением dealloc. Использовала ли в нем библиотеку ошибку?

ответ

1

[Объект JSONParserWithString:] возвращает объект с автоматическим высвобождением. Если вы хотите сохранить это, вы должны сохранить его - и только в этот момент вы станете ответственным за его освобождение. Но если вы не сохранили его, то не держите его и не отпускайте.

Вы сказали, что используете свойство сохранения, но действительно ли вы использовали свойство (self.ivar = object) или вы напрямую обращались к переменной (ivar = object)? Объект будет сохранен только при использовании свойства.

+0

Я установил свойство как ivar = object. Не понял этого факта, что я должен использовать метод setter (self.ivar или [self setIvar: myVariable]). Спасибо миллион за это! – testing

0

После того как я возвратил значение моего другого способа я обнулить parsedJSON

parsedJSON = nil; 

parsedJSON Так что, если получить dealloced ничего не происходит, потому что сообщение на ноль не вызывает приложение к краху. Несмотря на то, что я не нашел причину перевыпуска ...

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