我得到了两个不同类的方法。一种是类方法,另一种是实例方法。我从实例方法调用类方法。当实例方法完成时,它会给出运行时错误“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"]]];
如果我删除它,应用程序运行顺利。
答案 0 :(得分:1)
你不应该释放物品。
在fetchImmediateChildrenValues中释放val
,但它与您分配的val
不同,它是for循环中返回的val
。删除val
。
///NSString *val = ...
for(NSString *str in keys) {
NSString* val = (NSString *)[[tmp objectForKey:str] objectForKey:@"innertext"];
[pushArr addObject:val];
}
///[val release];
您使用密钥犯了同样的错误。你将密钥初始化为你拥有的东西(你分配它),然后用你不拥有的东西(它是自动释放)替换它(导致内存泄漏),然后释放释放自动释放对象的密钥。所以你过度发布它。
答案 1 :(得分:0)
我认为这个问题与
有关keys = [keys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
在sortedArrayUsingSelector的描述中,它表示它返回对原始数组的引用,但是你实际上是通过赋值覆盖它。为了安全起见而是分配一个新变量(并避免ev.mem leak)