NSMutableArray уничтожение - PullRequest
       11

NSMutableArray уничтожение

14 голосов
/ 07 октября 2008

У меня есть массив NSMutableArray со счастливыми объектами. Эти объекты злобно включают (пропускают) меня всякий раз, когда я пытаюсь очистить массив от всех объектов и снова заполнить его.

Распределяется в функции init следующим образом:

self.list = [NSMutableArray array];

Различные методы, которые я использовал, чтобы очистить его, включают:

self.list = nil;
self.list = [NSMutableArray array];

и

[self.eventList removeAllObjects];

Явное выделение и освобождение массива также не работает. Утечка происходит ТОЛЬКО при попытке сбросить список.

Я пропускаю шаг при сбросе или это другая проблема?

Ответы [ 5 ]

9 голосов
/ 10 октября 2008

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

- (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];
}

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

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

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

6 голосов
/ 07 октября 2008

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

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

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

MyEvent *otherEvent = [[[MyEvent alloc] initWithEventInfo:otherInfo] autorelease];
[self.eventList addObject:otherEvent];
4 голосов
/ 07 октября 2008

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

0 голосов
/ 10 октября 2008

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

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

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

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

Я бы сказал, чтобы помочь вам, я хотел бы точно знать, что именно в MallocDebug происходит утечка. Кроме того, @Elfred дает несколько полезных советов при проверке метода @property для массива, на самом деле его следует сохранить или скопировать.

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