2010-06-04 47 views
0

我得到了我在不同的类中都有两种方法。一个是类方法,另一个是实例方法。我从实例方法调用类方法。当实例方法完成时,会给运行时错误“EXC_BAD_ACCESS”。NSMUtableDictionary释放问题

#import "xmlObject.h" 
#import "textmeAppDelegate.h" 

@implementation Class1 
    - (void)method1 { 
     textmeAppDelegate *del = (textmeAppDelegate *)[[UIApplication sharedApplication] delegate]; 

     NSArray *bgColor = [[NSArray alloc] initWithArray:[xmlObject fetchImmediateChildrenValues:[del.navigationbarStyle objectForKey:@"backgroundcolor"]]]; 
     UIColor *color = [UIColor colorWithRed:[[bgColor objectAtIndex:3] floatValue] green:[[bgColor objectAtIndex:2] floatValue] blue:[[bgColor objectAtIndex:1] floatValue] alpha:[[bgColor objectAtIndex:0] floatValue]]; 
     CGContextSetFillColor(context, CGColorGetComponents([color CGColor])); 
     CGContextFillRect(context, rect); 
     [bgColor release]; 

    } 
@end 

@implementation xmlObject 
    + (NSArray *) fetchImmediateChildrenValues:(NSMutableDictionary *) node { 
     NSMutableDictionary *tmp = [[node objectForKey:@"children"] retain]; 
     NSArray *keys = [[NSArray alloc] initWithArray:[tmp allKeys]]; 
     keys = [keys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 
     NSMutableArray *pushArr = [[[NSMutableArray alloc] init] autorelease]; 
     NSString *val = [[NSString alloc] init]; 
     for(NSString *str in keys) { 
      val = (NSString *)[[tmp objectForKey:str] objectForKey:@"innertext"]; 
      [pushArr addObject:val]; 
     } 
     [val release]; 
     [keys release]; 

     return [NSArray arrayWithArray:pushArr]; 
    }   
@end 

代码有什么问题?同时也是应用崩溃的这行代码 应用程序崩溃,如果我加入这一行

NSArray *bgColor = [[NSArray alloc] initWithArray:[xmlObject fetchImmediateChildrenValues:[del.navigationbarStyle objectForKey:@"backgroundcolor"]]]; 

如果我删除应用程序运行速度流畅。

回答

1

当你不应该是你正在释放的对象。

在fetchImmediateChildrenValues中你释放了val,但它与0123'不一样,你分配的是0123'这里面的for循环里面。删除val的alloc和release。

///NSString *val = ... 
for(NSString *str in keys) { 
    NSString* val = (NSString *)[[tmp objectForKey:str] objectForKey:@"innertext"]; 
    [pushArr addObject:val]; 
} 
///[val release]; 

您对密钥进行相同的错误。你将键初始化为你自己拥有的东西(你已经分配了它),然后用不属于你的东西(这是自动释放)替换掉(导致内存泄漏),然后释放释放自动释放对象的键。所以你过来释放它。

再次阅读内存管理规则。见herehere

+0

谢谢你做到了。现在也给我malloc:***错误的对象0x43181e0:双启动应用程序的免费。任何想法为什么会发生? – 2010-06-04 13:38:33

0

我相信这个问题在sortedArrayUsingSelector的描述它说,它返回到原来的数组引用但是你有效覆盖,随着分配与

keys = [keys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 

相关。为了安全起见,分配一个新的变量(并避免ev。mem泄漏)

+0

这条线是正确的。我从iphone文档中拿走它。真正的问题是与NSMutableDictioanry正确的分配和释放 – 2010-06-04 12:58:32