2011-12-02 80 views
1

我在當前的iOS項目的xcode中運行「分析」以試圖追蹤凍結問題,並且有一些我不明白的內存警報(下面的屏幕截圖)。xcode中的分析和內存警報

這裏發生了什麼:我有一個自定義的ObjC類,擴展NSObject;在init方法中,我分配/ init一個NSMutableArray,然後在一個循環中,使用NSMutableArrays填充該嵌套數組。在這個執行路徑中沒有被引用的@對象,並且保留計數爲+1(在應用程序的生命中)。 。

由於我的類分配外部數組,它擁有它並將清理它。內部數組是否需要釋放?

感謝您的任何提示 - 這仍然是新的。

screenshot of xcode memory alert

編輯/添加 試圖消滅額外的內存警告我收到,所以我想我要補充的問題在這裏有人絆倒在這個瓦特/同樣的問題的情況下。

我收到以下代碼(第二行「[keyArray addObject:etc」))的警報。發生了什麼:我有一個自定義的類(Key - 基於NSObject),我實例化並存儲在一個數組中。根據我對上一個問題的回答,我猜我的分配會增加保留計數,然後當它被添加到數組時,保留計數不會減少 - 所以會發生內存警告。

什麼是正確的方式來處理這樣的事情?使用像這樣的佔位符:

Key * k = [[Key alloc] initKeyWithPath:path isBlackKey:NO]]; 
[keyArray addObject: k]; 
[k release]; 

這是正確的方法嗎?或者我有辦法寫自定義類來返回一個autoreleased obj? (感謝和抱歉,這麼長時間囉!)。

在線路460 方法分配的物體的潛在的泄漏返回一個Objective-C的對象用線460分配的1保留計數(擁有參考) 對象未在此執行路徑以後引用和具有保留的1計數(對象泄漏)

-(void) addOctaveToArraysWithTransform:(CGAffineTransform*)trans andPath: (CGMutablePathRef) path 
{ 
    path = [self createCF_keyUsingTransform: trans]; 
    [keyArray addObject:[[Key alloc] initKeyWithPath:path isBlackKey:NO]]; 
} 

Key.h

#import <Foundation/Foundation.h> 
#import "Key.h" 

@interface Key : NSObject { 
    @public 
    CGMutablePathRef keyPath; 
    BOOL isBlackKey; 
    NSValue * path; 
    int keyState; 
    BOOL needsRedraw; 
} 

@property (nonatomic, assign) int keyState; 
@property (nonatomic, assign) BOOL needsRedraw; 
@property (nonatomic) CGMutablePathRef keyPath; 

-(id) initKeyWithPath:(CGMutablePathRef) aPath isBlackKey:(BOOL)flag; 
-(CGMutablePathRef) getKeyPath; 

@end 

Key.m

#import "Key.h" 

@implementation Key 

@synthesize keyState, needsRedraw, keyPath; 

-(id) initKeyWithPath:(CGMutablePathRef) aPath isBlackKey:(BOOL)flag 
{ 
    if ((self = [super init])){ 
     isBlackKey = flag; 
     keyState = 0; 
     needsRedraw = NO; 
     keyPath = aPath; 
     CGPathRetain(keyPath); 
} 
return self; 
} 

-(CGMutablePathRef) getKeyPath 
{ 
    return keyPath; 
} 
@end 

回答

1

在for循環的每次迭代中,您都有一個NSMutableArray的分配。相反,使用:NSMutableArray array]這是一種方便的方法,它返回一個適合添加到fieldNotes的自動發佈的NSMUtableArray,它將保留NSMutableArray

2

是的,你必須釋放內部數組來平衡alloc/init。請記住,外部數組將保留每個內部數組,而外部數組可能會在稍後釋放。但是在這裏你仍然對你剛剛做的alloc/init負責。

希望有所幫助。