我在当前的iOS项目的xcode中运行“分析”以试图追踪冻结问题,并且有一些我不明白的内存警报(下面的屏幕截图)。xcode中的分析和内存警报
这里发生了什么:我有一个自定义的ObjC类,扩展NSObject;在init方法中,我分配/ init一个NSMutableArray,然后在一个循环中,使用NSMutableArrays填充该嵌套数组。在这个执行路径中没有被引用的@对象,并且保留计数为+1(在应用程序的生命中)。 。
由于我的类分配外部数组,它拥有它并将清理它。内部数组是否需要释放?
感谢您的任何提示 - 这仍然是新的。
编辑/添加 试图消灭额外的内存警告我收到,所以我想我要补充的问题在这里有人绊倒在这个瓦特/同样的问题的情况下。
我收到以下代码(第二行“[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