управление памятью просто любопытно - PullRequest
1 голос
/ 19 декабря 2010

Да, я знаю, что должен прочитать больше об управлении памятью, попытался найти и понять, но до сих пор не понимаю, почему этот бит кода падает, когда я выпускаю NSMutableArray (см. Код).Первоначально я выполняю alloc / init.

- (void)readSelectedPlayers {
//Prepare File Manager
NSString *filePath = [self dataFilePath];
NSFileManager *fileMgr;
fileMgr = [NSFileManager defaultManager];
//
NSMutableArray *theObjects = [[NSMutableArray alloc] initWithCapacity:0];
NSMutableArray *activePlayersArray = [[NSMutableArray alloc] initWithCapacity:0];
NSMutableArray *readyPlayers = [[NSMutableArray alloc] initWithCapacity:0];
//
// Select all keys from the plist
NSMutableDictionary *playerDict = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
NSArray *allMyKeys = [playerDict allKeys];
//
for(NSString * myKey in allMyKeys) {
    theObjects = [playerDict valueForKey:myKey];

    if ([[theObjects objectAtIndex:1] intValue] == YES) {
        [activePlayersArray addObject:myKey];
    }
}
NSLog(@"activePlayersArray: %@", activePlayersArray);
//
//========CALL AccesQuestionDB MODULE TO SHUFFLE PLAYERS=========//
AccessQuestionsDB *shufflePlayersFunction = [AccessQuestionsDB new];
readyPlayers = [shufflePlayersFunction shufflePlayers: activePlayersArray];
NSLog(@"readyPlayers: %@", readyPlayers);
//
[readyPlayers release];
[theObjects release];
[activePlayersArray release];

}

'//' между строками просто для лучшего форматирования кода здесь.

Ответы [ 3 ]

1 голос
/ 19 декабря 2010

Вам не нужно выделять / init readyPlayers переменную, потому что вы получите ее из метода shufflePlayers.readyPlayers, возвращаемый с shufflePlayers, также должен быть автоматически освобожден, поэтому вам не нужно его отпускать.

0 голосов
/ 19 декабря 2010

Вы выделяете память для своей переменной readyPlayers, но затем указываете на какой-то другой сегмент памяти:

readyPlayers = [shufflePlayersFunction shufflePlayers: activePlayersArray];

readPlayer теперь автоматически выпущен. Вы потеряли дескриптор ранее выделенной памяти.

Что вам нужно сделать, это в основном:

if (readplayer!= nil){
   [readplayer release];
}
readplayer = [[shufflePlayersFunction shufflePlayers: activePlayersArray] retain];

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

Но ... Не пытайтесь делать это !!! Вот для чего у вас есть свойства. Сделайте readyplayer переменной экземпляра, объявите для нее свойство и используйте synthesize. Теперь измените выделение на:

[self setReadyPlayers: [NSMutableArray array]];

установить читателя по:

[self setReadyPlayers: [shufflePlayersFunction shufflePlayers: activePlayersArray]];

Не нужно беспокоиться об освобождении вашего массива в dealloc и т. Д. Позвольте операционной системе работать за вас. Если readyPlayers на самом деле является просто временной переменной, забудьте о alloc и release и позвольте авто-релизу обработать его.

[shufflePlayersFunction shufflePlayers: activePlayersArray]

должен возвращать автоматически освобожденный массив.

NSMutableArray *readyPlayers = [shufflePlayersFunction shufflePlayers: activePlayersArray];
NSLog(@"%@", readyPlayers);
// now forget about it
0 голосов
/ 19 декабря 2010

Почему вы выделяете экземпляр NSMutableArray, а затем устанавливаете его на NSArray? Когда вы делаете

 NSMutableArray *theObjects = [[NSMutableArray alloc] initWithCapacity:0];

вы создаете NSMutableArray с емкостью 0 и сохраняете его в указатель с именем theObjects. Позже вы делаете:

theObjects = [playerDict valueForKey:myKey];

, который устанавливает указатель, который вы создали ранее, на [playerDict valueForKey:myKey]. Таким образом, вы потеряете оригинальный указатель на выделенный NSMutableArray. Когда вы отправляете release на theObjects, у вас больше нет доступа к первоначально созданному NSMutableArray!

Я не уверен, чего вы здесь добиваетесь, но я бы сделал:

NSArray *theObjects;
// some code
for(NSString * myKey in allMyKeys) {
    theObjects = [playerDict valueForKey:myKey];
    // some more code
}
// don't release "theObjects". It's just a pointer...

То же самое верно для массива readyPlayers, как указала tia.

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