0

我有我在不同的类中有两种方法。一种是类方法,另一种是实例方法。我正在从实例方法调用类方法。当实例方法完成时,它会给出运行时错误“EXC_BAD_ACCESS”。

#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"]]];

如果我删除它应用程序运行顺利。

4

2 回答 2

1

你在不应该的时候释放对象。

在 fetchImmediateChildrenValues 你 release val,但它与val你分配的不同,它是val在 for 循环中返回的。删除分配并释放val.

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

你用钥匙犯了同样的错误。您将密钥初始化为您拥有的东西(分配它),然后用您不拥有的东西(它是自动释放)替换它(导致内存泄漏),然后释放释放自动释放对象的密钥。所以你过度释放它。

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

于 2010-06-04T13:30:59.173 回答
0

我相信这个问题与

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

在 sortedArrayUsingSelector 的描述中,它说它返回对原始数组的引用,但是您实际上是用赋值覆盖了它。为了安全起见,请改为分配给新变量(并避免 ev.mem 泄漏)

于 2010-06-04T12:42:27.297 回答