微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NSMutableArray类别中的泄漏,它返回填充有NSNull的数组

如何解决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 举报,一经查实,本站将立刻删除。