如何解决NSMutableArray类别中的泄漏,它返回填充有NSNull的数组
|| 我目前有一个NSMutableArray类别,该类别创建随NSNulls传播的NSMutableArray。当我在Instruments中运行此代码时,它告诉我这里有一个泄漏(请阅读注释以了解位置)#import \"NSMutableArray+NSNull.h\"
@implementation NSMutableArray (NSNull)
-(id)initWithNullCapacity:(int)capacity{
self = [super init];
if (self) {
//Leak on [self init]
NSMutableArray *array = [self init];
for (unsigned i = 0; i < capacity; i++)
{
[array addobject:[NSNull null]];
}
self = array;
}
return self;
}
编辑:
这是我调用方法的地方:
#import \"TWvstatData.h\"
#import \"NSMutableArray+NSNull.h\"
@implementation TWvstatData
@synthesize creationTime;
@synthesize graphs;
@synthesize elements;
@synthesize type;
-(id)init{
if(self == [super init]){
type = -1;
creationTime = [[NSDate alloc] init];
graphs = [[NSMutableArray alloc] initWithNullCapacity:3];
elements =[[NSMutableArray alloc] init];
}
return self;
}
解决方法
您不是在创建NSMutableArray的子类,而只是添加一个类别,因此调用[super init]将调用NSArray而不是NSMutableArray初始化器,无论如何它都会被调用,以防万一它做一些重要的事情。
而且,正如Ravin提到的那样,在不先调用[self release]的情况下设置self =会泄漏先前的对象,该对象是从调用堆栈中的alloc调用返回的。
这是您应该做的:
-(id)initWithNullCapacity:(int)capacity
{
self = [self initWithCapacity:capacity];
if (self)
{
for (int i = 0; i < [self count]; i++)
{
[self addObject:[NSNull null]];
}
}
return self;
}
,这将是棘手的,主要是因为“ 3”在下面的工作方式。我建议这样做:
- (id)initWithNullCapacity:(NSUInteger)capacity {
NSMutableArray *nulls = [NSMutableArray array];
for (NSUInteger i = 0; i < capacity; i++) {
[nulls addObject:[NSNull null]];
}
return [self initWithArray:nulls];
}
我认为问题出在to5ѭ,尽管我不确定。 NSArray
在后台进行了一些时髦的优化,因此在您准备好所有数据准备就绪之前,我将避免调用all3ѭ初始化程序。
,是的,因为第一行
self = [super init];
您正在创建一个对象(self
),而在self = array;
,则取消引用self
并重新分配它。所以早期的价值在泄漏。
,-(id)initWithNullCapacity:(int)capacity
{
self = [super init];
if (self) {
for (unsigned i = 0; i < capacity; i++)
{
[self addObject:[NSNull null]];
}
}
return self;
}
应该做的工作
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。