SBJsonParser: приложение падает, если я не сохраняю возвращаемое значение - PullRequest
0 голосов
/ 06 октября 2010

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

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

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

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

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

С NSZombieEnabled я получаю

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

Я получаю этого зомби после того, как внес изменение.Раньше я использовал свойство и Interface Builder для моего контроллера представления, и у меня не было сбоев, потому что контроллер представления не был немедленно освобожден.Сейчас я делаю это:

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

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

Ответы [ 2 ]

1 голос
/ 07 октября 2010

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

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

0 голосов
/ 07 октября 2010

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

parsedJSON = nil;

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

...