0

両方とも異なるクラスの2つのメソッドがあります。1つはクラスメソッドで、もう1つはインスタンスメソッドです。インスタンスメソッドからクラスメソッドを呼び出しています。インスタンスメソッドが終了すると、ランタイムエラー「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でリリースしますが、割り当てvalたものと同じではなく、forループ内に返されます。の割り当てを削除して解放します。valvalval

///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:)];

sortArrayUsingSelectorの説明では、元の配列への参照を返すと記載されていますが、割り当てで効果的に上書きしています。安全を期すために、代わりに新しい変数に割り当てます(そして、ev。memリークを回避します)

于 2010-06-04T12:42:27.297 に答える