Obj-C: правильно выпустить выделенные объекты в цикле - PullRequest
0 голосов
/ 19 августа 2011

Надеюсь, я смогу объяснить это хорошо.Предположим следующее:

@interface ClassA : NSObject {
   NSMutableArray firstArray;
   NSArray secondArray;
}

#import "ClassA"
@interface ClassB : NSObject {
   ClassA classAobject;
}

Затем в какой-то другой части программы 'Psuedo-code' доступ к ключам словаря, например:

NSMutableArray* sample = [[NSMutableArray alloc] init];
for (keys in Data)
{
    ClassA* aObj = [[ClassA alloc] initWith: objectForKey:@"KeyHere" andWith:@"Key2Here"];

    ClassB* bObj = [[ClassB alloc] init];
    [bObj setClassAObj: aObj];

    [sample addObject: bObj];
}
Singleton* single = [Singleton single];
[single setArray: sample];

Мой вопрос связан с созданными объектами ClassA и ClassBвнутри цикла и массива для хранения их вне цикла.Я теряю память здесь, не выпуская их?Если я их освобождаю, как я могу сделать так, чтобы я не потерял ссылку на них в синглтоне, для которого я храню массив «sample»?

Если это имеет значение, массив Singletonкоторый он хранится, выделяется и инициализируется в методе "init" класса.

Ответы [ 2 ]

1 голос
/ 19 августа 2011

NSMutableArray выполняет сохранение и освобождение объектов, когда они добавляются и удаляются соответственно. Таким образом, вы получаете одно сохранение для alloc, а затем второе сохранение для add. Когда массив уничтожен, он освободит его. Это оставляет вас со счетом удержания 1.

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

1 голос
/ 19 августа 2011

Добавление объектов в массив сохраняет объекты.Поэтому вам нужно освободить их после того, как вы добавите их (если не выпущены автоматически).Точно так же вы должны убедиться, что @properties для массива переменных экземпляра (в Singleton) настроен на сохранение, чтобы массив образцов сохранялся при установке в singleton.Затем вам также нужно освободить образец.

Кроме того, переменные вашего экземпляра должны быть указателями:

@interface ClassA : NSObject {
   NSMutableArray *firstArray;
   NSArray *secondArray;
}

#import "ClassA"
@interface ClassB : NSObject {
   ClassA *classAobject;
}
...