Проблема доступа к NSMutableArray - PullRequest
2 голосов
/ 19 февраля 2012

Я (кажется, я) знаю, о чем ты думаешь ... не другой вопрос EXC_BAD_ACCESS, но я действительно борюсь, и это сводит меня с ума. Я искал все выше и ниже по всей сети и , и проблема, с которой я сталкиваюсь, связана с управлением моей памятью.

Проблема:

В основном у меня есть NSMutableArray, который отслеживает некоторые кибер-продукты. Так как пищу можно добавлять и убирать одновременно, у меня есть отдельный массив, который проверяет элементы, которые нужно удалить, и содержит те, которые не должны быть извлечены. Идея состоит в том, чтобы затем очистить исходный массив ( _food ) и скопировать обратно все элементы, сохраненные во временном массиве ( foodToKeep ). Вот код

NSMutableArray *foodToKeep = [[NSMutableArray alloc] init];

for (Food *food in _food) {
    if(!food.removeable){
        [foodToKeep addObject:food];
        [food release];
    }
}

if(foodToKeep > 0){
  [_food removeAllObjects];

  for (Food *food in foodToKeep) {
      [_food addObject:food]; // EXC_BAD_ACCESS error here
      [food release];
      }
  }
}

[foodToKeep release];

Я получаю ошибку неверного доступа при добавлении продуктов в исходный массив. После поиска вокруг кажется, что массив _food где-то освобождается или каким-то образом заканчивается как nil . Единственное место, где у меня есть release для _food, это метод dealloc, поэтому я не могу понять, почему это происходит.

Я довольно новичок в Objective-C (так что будьте осторожны со мной!), Но, насколько я могу судить, здесь нет утечек и случайных выбросов, которые вызывают это, я думаю, что мне нужен экспертный взгляд посмотрим, что, скорее всего, тривиальная ошибка с моей стороны: -P

Edit: Пища определяется и распределяется здесь:

    @interface MainLayer
    {
        NSMutableArray *_food;
    }

В классе init метод

    _food = [[NSMutableArray alloc] init];

Ответы [ 3 ]

4 голосов
/ 19 февраля 2012

Вы перевыпускаете здесь:

for (Food *food in _food) {
    if(!food.removeable){
        [foodToKeep addObject:food];
        // [food release];  <--- REMOVE THIS
    }
}

А здесь

for (Food *food in foodToKeep) {
      [_food addObject:food]; // EXC_BAD_ACCESS error here
      // [food release]; <--- REMOVE THIS
}

Удалите лишние релизы, и у вас все будет хорошо.

4 голосов
/ 19 февраля 2012

Вы выпускаете Food объектов, которые вам не принадлежат.Взгляните на Objective-C Правила управления памятью .

Фактически, в строке:

for (Food *food in _food) {

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

1 голос
/ 19 февраля 2012

Вы освобождаете food после того, как добавили его в массив, но релиз не уравновешивает вызов retain, поэтому, когда вы достигаете [_food removeAllObjects], вероятно, все объекты Food освобождаются там и, следовательно, он падает при попытке чтобы получить доступ к нему позже.

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