Как правильно инициализировать переменную экземпляра в Objective C без утечки памяти? - PullRequest
2 голосов
/ 14 октября 2010

У меня есть такой класс:

@interface MyCollection : NSObject {
    NSMutableDictionary *data;
}

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

- (id) init {
    if(self = [super init])
    {
        self.data = [[NSMutableDictionary alloc] init];
    }
    return self;
}

Теперь, когда я создаюобъект этого класса в моем коде выглядит так:

MyCollection *c = [[MyCollection alloc] init];

... в этот момент утилита Leaks показывает, что у меня утечка памяти в функции init в той самой строке, где я пытаюсь установитьпеременная экземпляра.Я совершенно новичок в Objective C & Iphone, и я не могу просто понять, что здесь происходит не так.Я прочитал «Руководство по управлению памятью» и все такое, но мне кажется, что мне здесь не хватает чего-то очень серьезного.

Любая помощь будет принята с благодарностью.Спасибо за ваше время уже.

Ответы [ 5 ]

6 голосов
/ 14 октября 2010

вы используете self.data =.Так что, скорее всего, есть недвижимость.И, скорее всего, это свойство, которое копирует или сохраняет ваш объект, если вы его используете.
Вызывая

 self.data = [[NSMutableDictionary alloc] init];

Число сохраняемых NSMutableDictionary увеличивается из-за alloc, а если свойствоУ данных есть заявление о сохранении или копировании, вы получаете еще одно увеличение количества сохраняемых данных.

Вы можете написать data = [[NSMutableDictionary alloc] init]; или self.data = [NSMutableDictionary dictionary].Это увеличит количество сохраняемых файлов только один раз.

И не забудьте освободить объект в dealloc.

1 голос
/ 19 октября 2010

Я вижу странные ситуации с утилитой Leaks, иногда она сообщает о старых утечках, иногда не сообщает о новых и т. Д.Кроме того, из того, что я мог бы собрать со всеми вашими ответами и мнениями в других местах в Интернете, люди разделились в отношении того, следует ли указывать ноль или нет.На данный момент я решил ситуацию с помощью следующего подхода.

- (id) init {
    if(self = [super init])
    {
        data = [[[NSMutableDictionary alloc] initWithCapacity:0];
    }
    return self;
}

-(void)dealloc
{
    [data release];
}

Спасибо всем за помощь.

1 голос
/ 15 октября 2010

чтобы добавить к тому, что упомянул fluchtpunkt, вы можете попробовать это вместо:

- (id) init {
    if(self = [super init])
    {
        self.data = [NSMutableDictionary dictionaryWithCapacity:0];
    }
    return self;
}

и в dealloc

-(void)dealloc
{
  self.data = nil;
}
1 голос
/ 14 октября 2010

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

0 голосов
/ 15 октября 2010

Вы создаете экземпляр «MyCollection» в разделе интерфейса?

Если у него есть область действия метода, попробуйте выпустить его тем же методом после того, как с ним покончено.

...