2010-06-04 45 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