我在当前iOS项目的xcode中运行'analyze'以尝试追踪冻结问题,并且有一些我不理解的内存警报(下面的屏幕截图)。
那里发生了什么:我有一个自定义的ObjC类扩展NSObject;在init方法中我分配/初始化NSMutableArray,然后在循环中用NSMutableArrays填充它。此嵌套数组声明为属性,并在dealloc()中释放。它适用于应用程序的生命。
我这样做错了吗?我不明白警报#3:@对象在此执行路径中未被引用,并且保留计数为+1。
由于我的类分配外部数组,它拥有它并将清理它。是否需要释放内部数组?
感谢您的任何提示 - 此处仍然是新的。
修改/ 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
答案 0 :(得分:2)
是的,您必须释放内部数组以平衡alloc / init。请记住,外部数组将保留每个内部数组,外部数组可能会在以后释放它们。但是在这里你仍然负责你刚刚做的alloc / init。
希望有所帮助。
答案 1 :(得分:1)
在for循环的每次迭代中都有一个NSMutableArray的分配。而是使用:NSMutableArray array]
这是一种方便的方法,它返回一个适合添加到fieldNotes
的自动释放的NSMUtableArray,它将保留NSMutableArray
。