не может выпустить объекты после извлечения из списка - PullRequest
0 голосов
/ 07 июля 2010

У меня все еще есть простой код objC, который извлекает некоторые данные из plist.После того, как я их использовал, я не могу освободить объект, потому что он не работает ...

- (void)retrieveFromPlist:(NSString*)Nazov
{
NSLog(@"Objekt: %@",Nazov);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *path = [documentsDirectory stringByAppendingPathComponent:@"working.plist"];
////Zober vsetky ulozene

NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
NSMutableDictionary *subDict = [[NSMutableDictionary alloc] init];
subDict = [dict objectForKey:Nazov];

NSString                    *hudbaR;
float                       hudbaL;
NSString                    *zvukR;
float                       zvukL;


hudbaL = [[subDict objectForKey:@"musicLevel"] floatValue];
hudbaR = [subDict objectForKey:@"musicRow"];
zvukL = [[subDict objectForKey:@"soundLevel"] floatValue];
zvukR = [subDict objectForKey:@"soundRow"];

NSLog(@"Musical level: %f, musical roww:%@ , zuk level: %f, zuk row: %@", hudbaL,hudbaR ,zvukL ,zvukR );



if (hudbaR) {
    [musicController setBackgroundSoundVolume:zvukL];
    [musicController setBackgroundMusicVolume:hudbaL];

    MusicsliderCtl.value = hudbaL;
    sliderCtl.value = zvukL;


    [musicController playMusicWithKey:hudbaR timesToRepeat:0];  
    [musicController playSoundWithKey:zvukR timesToRepeat:0];

}   

//[dict release];
//[subDict release];
}

Ответы [ 2 ]

2 голосов
/ 07 июля 2010
NSMutableDictionary *subDict = [[NSMutableDictionary alloc] init];
subDict = [dict objectForKey:Nazov];

2-й оператор переопределяет уже выделенный subDict.Это вызывает утечку памяти.Тогда, поскольку у вас нет [dict objectForKey:Nazov], -release, это вызывает ошибку освобождения.

Вы можете просто написать

NSDictionary* subDict = [dict objectForKey:Nazov];

и не-release это так как ты не владелец.([dict release] все еще необходим, поскольку вы - тот, кто +alloc это.)

Если вы не меняете коллекцию, предпочтите неизменяемый (NSDictionary) вместо изменяемого (NSMutableDictionary).

0 голосов
/ 07 июля 2010

Вы пытаетесь освободить автоматически выпущенный объект (subDict), к которому ваш код не принадлежит:

NSMutableDictionary *subDict = [[NSMutableDictionary alloc] init];
subDict = [dict objectForKey:Nazov];

Первоначально переменная subDict перезаписывается значением, возвращаемым из сообщения objectForKey:. В результате сначала происходит утечка исходного объекта, а затем происходит сбой при попытке пула автоматического выпуска освободить новый объект.

Чтобы исправить это, удалите следующие строки в вашем коде:

NSMutableDictionary *subDict = [[NSMutableDictionary alloc] init];
...
[subDict release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...