Может ли кто-нибудь объяснить мне, почему мне «нужно» сохранить оператор в следующем сегменте кода? - PullRequest
1 голос
/ 10 октября 2011

Я верю в обучение на протяжении всего процесса, и следующий фрагмент кода мне не очень понятен.Я знаю, что оператор alloc увеличит количество сохраняемых данных, однако есть некоторые аспекты разработки iOS, которые все еще очень меня смущают.

Зачем мне нужно: [jokesArray retain]; в следующем сегменте кода?

У меня есть jokesArray = [[NSArray alloc]init]; и из того, что я прочитал, достаточно для сохранения?

Может ли кто-нибудь объяснить в понятной форме, почему требуется это сохранение?(В противном случае приложение вылетает с EXC_Bad_Access.

У меня были добрые люди, которые пытались объяснить, но это не помогло. Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 10 октября 2011

У вас есть это:

jokesArray = [[NSArray alloc]init];

Отдельно у вас есть это:

jokesArray = [resultsDictionary allValues];

Второй вызов, вызывающий allValues, выделяет совершенно новый jokesArray.Тот, который вы уже распределили, теперь потерян (при условии, что jokesArray не является сохраняемым свойством), и вы должны освободить его перед повторным назначением через строку allValues.

Причина, по которой вам нужно «сохранить» послевызов allValues ​​происходит потому, что память, выделенная в allValues, будет помечена для автоматического выпуска.Если вы хотите, чтобы эта память оставалась (и, похоже, так и есть), вам нужно сохранить ее.Тогда ваш вызов release в viewDidUnload должен кое-что освободить, а ваши другие ссылки на jokesArray (например, вызов count) имеют некоторую память, с которой нужно действовать.

Переключение на использование сохраненного свойства избавит вас от всех этих хлопот.

1 голос
/ 10 октября 2011

Вы пропускаете свое предыдущее распределение NSArray, потому что в этой части кода:

 NSDictionary *resultsDictionary = [responseString objectFromJSONString];
    jokesArray = [resultsDictionary allValues];

    [jokesArray retain];

Вы создаете NSDictionary и заменяете все, что указывал jokesArray, чтобы указать на данные из NSDictionary, который вы только что создали. Кроме того, данные, возвращаемые NSDictionary, были созданы с использованием удобного метода инициализации, который означает, что они будут освобождены через некоторое время, и, следовательно, причина, по которой вам нужно сохранить.

Поскольку вы изменяете переменную jokesArray напрямую, ранее выделенный NSArray не освобождается, когда вы заменяете его новым объектом.

1 голос
/ 10 октября 2011

Насколько я могу судить, jokesArray сохраняется при инициализации.

Однако, поскольку у вас есть эта строка:

jokesArray = [resultsDictionary allValues];

Вы назначаете совершенно другой объект переменнойследовательно, вы сохраняете совершенно другой объект.Я предполагаю, что вы хотели бы что-то вроде:

[jokesArray addObjectsFromArray:[resultsDictionary allValues]];

, если это изменяемый массив.если нет, вам придется инициализировать новый.В этом случае я бы, вероятно, инициализировал jokesArray только тогда, когда это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...