«Удалить все объекты» предполагается выпустить? - PullRequest
1 голос
/ 27 августа 2010

Я решил начать использовать removeAllObjects, чтобы я мог повторно использовать некоторые из своих NSMutableArrays. Тем не менее, я обнаружил, что вызов removeAllObjects вызывает освобождение массива и поэтому он падает, когда viewController отображается во второй раз.

Я смотрел в Интернете, и кажется, что некоторые люди говорят, что removeAllObjects просто очищает их массив, в то время как другие говорят, что он также освобождает массив. Что является правдой? Похоже, это освобождает меня, но я нахожу это странным и ожидаю, что поведение будет просто выпустить объекты в массиве. Ничто в документации не предупреждает об этом, что я тоже нахожу странным.

РЕДАКТИРОВАТЬ: С включенным NSZombies все, что я получаю, это:

  • - [__ NSArrayM removeAllObjects]: сообщение отправлено освобожденному экземпляру 0x625e4e0

По сути говоря, поскольку массив был освобожден из-за removeAllObjects, он не может вызвать removeAllObjects второй раз ... Argh!

Может кто-нибудь помочь, пожалуйста?

Спасибо!

Ответы [ 6 ]

3 голосов
/ 27 августа 2010

Ладно, я идиот!

Я делал:

[myArray removeAllObjects];
myArray = someOtherObject.someArray;

поэтому сбрасывает указатель на какой-то другой объект. Я теперь изменил это на это:

[self.myArray removeAllObjects];
[self.myArray addObjectsFromArray:someOtherObject.someArray];

И теперь все в порядке. Я идиот! Извините всех, спасибо за вашу помощь!

3 голосов
/ 27 августа 2010

removeAllObjects освобождает объекты в массиве, но не влияет на сам массив (за исключением того, что он пуст).

Если только

один или несколько объектов в массива имеют сохраненную ссылку на сам массив.

2 голосов
/ 27 августа 2010

removeAllObjects не освобождает сам массив, как вы и ожидаете.Если это выпущено, проблема в другом месте.Вы можете использовать инструменты NSZombie, чтобы проверить, где он выпускается.

1 голос
/ 27 августа 2010

NSZombies не может сказать вам, где объект был выпущен, поэтому он показывает вам, когда вы впервые отправляете сообщение освобожденному объекту.

Работайте в обратном направлении от этого вызова к -removeAllObjects, и вы найдете ошибку.

1 голос
/ 27 августа 2010

Если вы автоматически выпускаете свои MutableArrays, они могут быть освобождены, когда они пусты, как они после вызова removeAllObjects. Используйте NSZombies, чтобы посмотреть, где он выпущен.

0 голосов
/ 24 июня 2016

[yourArray removeAllObjects]; Похоже, что элемент yourArray автоматически выпустит

...