在xcode中分析和记忆警报

时间:2011-12-02 00:34:36

标签: xcode memory-leaks ios4

我在当前iOS项目的xcode中运行'analyze'以尝试追踪冻结问题,并且有一些我不理解的内存警报(下面的屏幕截图)。

那里发生了什么:我有一个自定义的ObjC类扩展NSObject;在init方法中我分配/初始化NSMutableArray,然后在循环中用NSMutableArrays填充它。此嵌套数组声明为属性,并在dealloc()中释放。它适用于应用程序的生命。

我这样做错了吗?我不明白警报#3:@对象在此执行路径中未被引用,并且保留计数为+1。

由于我的类分配外部数组,它拥有它并将清理它。是否需要释放内部数组?

感谢您的任何提示 - 此处仍然是新的。

screenshot of xcode memory alert

修改/ ADDITION 试图消除我得到的额外内存警告,所以我想如果有人偶然发现这个问题,我会在这里添加问题。

我收到以下代码的警告(第二行“[keyArray addObject:etc”))。发生了什么:我有一个自定义类(基于NSObject的键),我实例化并存储在一个数组中。根据前一个问题的答案,我猜我的alloc增加了保留计数,然后当它被添加到数组时,保留计数不会减少 - 所以发生内存警告。

处理这样的事情的正确方法是什么?使用这样的占位符:

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

这是正确的方法吗?或者我是否可以编写自定义类来返回自动释放的obj? (谢谢,很抱歉这么久了!)。

  

在第460行分配的对象的潜在泄漏   方法返回一个具有+1保留计数的Objective-C对象(拥有引用)   在第460行上分配的对象稍后在此执行路径中未被引用,并且保留计数为+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

2 个答案:

答案 0 :(得分:2)

是的,您必须释放内部数组以平衡alloc / init。请记住,外部数组将保留每个内部数组,外部数组可能会在以后释放它们。但是在这里你仍然负责你刚刚做的alloc / init。

希望有所帮助。

答案 1 :(得分:1)

在for循环的每次迭代中都有一个NSMutableArray的分配。而是使用:NSMutableArray array]这是一种方便的方法,它返回一个适合添加到fieldNotes的自动释放的NSMUtableArray,它将保留NSMutableArray