Разрушение NSMutableArray

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

14
задан Venk 3 June 2013 в 07:24
поделиться

5 ответов

Как Вы создавали объекты, которые протекают? Если Вы сделали что-то вроде этого:

- (void)addObjectsToArray {

    [list addObject:[[MyClass alloc] init];

    OtherClass *anotherObject = [[OtherClass alloc] init];
    [list addObject:anotherObject];
}

затем Вы пропустите два объекта, когда список будет освобожден.

необходимо заменить любой такой код:

- (void)addObjectsToArray {

    MyClass *myObject = [[MyClass alloc] init];
    [list addObject:myObject];
    [myObject release];

    OtherClass *anotherObject = [[OtherClass alloc] init];
    [list addObject:anotherObject];
    [anotherObject release];
}

Более подробно:

, Если Вы следуете за первым шаблоном, Вы создали два объекта, которыми, согласно правила управления памятью Какао Вы владеете. Это - Ваша обязанность оставить владение. Если Вы не сделаете, то объект никогда не будет освобождаться, и Вы будете видеть утечку.

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

9
ответ дан 1 December 2019 в 13:22
поделиться

Вы обращаетесь к объектам в утечке массива?

, Как Вы добавляете объекты к массиву? Массив сохранит их, таким образом, необходимо будет автовыпустить или выпустить их после добавления их к массиву. Иначе после того, как массив выпущен, объекты будут все еще сохранены (протек).

MyEvent *event = [[MyEvent alloc] initWithEventInfo:info];
[self.eventList addObject:event];
[event release];

MyEvent *otherEvent = [[[MyEvent alloc] initWithEventInfo:otherInfo] autorelease];
[self.eventList addObject:otherEvent];
6
ответ дан 1 December 2019 в 13:22
поделиться

на что Ваш @property похоже объявление? Вы синтезируете средства доступа? Если так, Вам нужно @property(retain). Я предполагаю, что, когда Вы говорите, что объекты включают Вас, Вы обращаетесь к дампу ядра (EXC\_BAD\_ACCESS).

4
ответ дан 1 December 2019 в 13:22
поделиться

Если утечка только происходит, когда Вы пытаетесь сбросить список, у Вас есть кто-то/что-то еще использующий те другие объекты, которые Вы просто попытались выпустить.

0
ответ дан 1 December 2019 в 13:22
поделиться

Я сказал бы, что у меня действительно нет достаточной информации здесь, чтобы дать Вам большой ответ. Вы говорите, что эти NSMutableArray все еще выделяется, но пустой и не имеет никаких объектов в нем, но что объекты однажды ранее в массиве все еще выделяются даже при том, что они должны быть dealloc'd в той точке в приложении?

, Если это так, массив мог возможно быть пустым, но Ваши объекты не обрабатывают сообщение dealloc, отправленное им, в этом случае объекты находятся все еще вокруг в памяти, но не сосланы чем-либо.

я сказал бы для помощи Вам, я хотел бы знать точно, что точно заявляет MallocDebug, пропускается. Также @Elfred выделяет некоторый хороший совет в проверке Вашего @property метод для массива, действительно это должно быть, сохраняют или копируют.

0
ответ дан 1 December 2019 в 13:22
поделиться