Почему инструменты сообщают об этом как об утечке памяти? - PullRequest
1 голос
/ 07 апреля 2009

У меня есть код, который выглядит следующим образом:

NSMutableArray *bar = [[NSMutableArray alloc] initWithCapacity:0];
NSMutableDictionary *foo = [[NSMutableDictionary alloc] initWithCapacity:0];
[foo setObject:[NSNull null] forKey:@"yay"];
[bar addObject:foo];

[foo release];

Приборы показывают, что foo протекает. Я понимаю, почему это происходит. Число сохраняемых Foo, когда alloc'd равно 1. Затем, когда аддон bar addObject, число сохраняемых значений становится равным 2. Позже, когда я освобождаю foo, оно возвращается к 1. Все еще утечка. Однако позже в моем коде (в отдельном методе, поэтому я думаю, что это может быть показано как утечка)

[bar removeAllObjects];

Почему foo отображается как утечка, если позже я удалю все объекты?

** ПРИМЕЧАНИЕ **

Я не включил его в свой исходный пост, но bar действительно выпускается в методе dealloc классов.

Ответы [ 3 ]

3 голосов
/ 07 апреля 2009

Учитывая то, что вы показываете, это bar, который никогда не будет выпущен. Вызов [bar removeAllObjects] удаляет только содержащиеся в нем объекты. Вместо этого вы должны позвонить [bar release], когда закончите с bar. Это автоматически освободит все объекты, которые удерживает bar, плюс сам объект bar.

Вы заявляете, что понимаете концепции управления памятью, поэтому, возможно, вы просто не показали, что bar выпущено в вашем примере.

edit: Я думаю, у Крейга правильная идея в его ответе . Одним из способов избежать предупреждения (возможно) было бы выделить bar в методе класса init. Я обычно нахожу полезным поддерживать симметрию между моими init и dealloc методами, когда речь идет о переменных-членах, и это будет хорошим примером:

- (id)init
{
    if ((self = [super init]) == nil) { return nil; }

    bar = [[NSMutableArray alloc] initWithCapacity:0];

    return self;
}

- (void)dealloc
{
    [bar release];

    [super dealloc];
}

- (void)YourMethod
{
    NSMutableDictionary *foo = [[NSMutableDictionary alloc] initWithCapacity:0];
    [foo setObject:[NSNull null] forKey:@"yay"];
    [bar addObject:foo];
    [foo release];
}
3 голосов
/ 07 апреля 2009

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

0 голосов
/ 07 апреля 2009

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

Из главы О'Рейли по управлению памятью:

Когда вы добавляете объект в коллекцию, он сохраняется. Когда вы удаляете объект из коллекции, он освобождается. Освобождение объекта коллекции (такого как NSArray) освобождает также все объекты, хранящиеся в нем.

Возможно, что-то еще происходит в инструментах?

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