Ios 从plist检索后无法释放对象

Ios 从plist检索后无法释放对象,ios,objective-c,iphone,Ios,Objective C,Iphone,我仍然使用一个简单的objC代码从plist中检索一些数据。在我使用它们之后,我无法释放对象,因为它失败了 - (void)retrieveFromPlist:(NSString*)Nazov { NSLog(@"Objekt: %@",Nazov); NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDire

我仍然使用一个简单的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条语句覆盖已分配的子ct。这会导致内存泄漏。然后,由于您不拥有
[dict objectForKey:Nazov]
-release
会导致释放错误

你可以直接写

NSDictionary* subDict = [dict objectForKey:Nazov];
不要发布它,因为你不是它的所有者。(
[dict release]
仍然需要,因为您是
+alloc
的人。)


如果不更改集合,请选择不可变(NSDictionary)而不是可变(NSMutableDictionary)。

您正在尝试释放代码没有所有权的自动删除对象(子CT):

NSMutableDictionary *subDict = [[NSMutableDictionary alloc] init];
subDict = [dict objectForKey:Nazov];
原来的
子ct
变量正在被
objectForKey:
消息的返回值覆盖。首先导致原始对象泄漏,然后在自动释放池尝试释放新对象时崩溃

要更正此问题,请删除代码中的以下行:

NSMutableDictionary *subDict = [[NSMutableDictionary alloc] init];
...
[subDict release];

“失败”是什么意思?另外,你能不能把帖子编辑得好看一点(整个代码都使用代码块)。发布调用是否在retrieveFromPlist方法的范围内?由于格式问题,很难说。如果没有,请将它们移动到声明字典的方法中。否则,您将尝试使用范围外变量。
NSMutableDictionary *subDict = [[NSMutableDictionary alloc] init];
...
[subDict release];