2011-12-02 71 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负责。

希望有所帮助。