NSData内存泄漏

时间:2011-09-22 13:37:30

标签: iphone memory-leaks nsdata

仪器显示我在那里得到了内存泄漏:

-(id) copyWithZone: (NSZone *) zone
{ 
    Layer *copy = [[Layer allocWithZone:zone]init];
    NSData *imageData = [[NSData alloc]initWithData:_image];
    copy.image = imageData;
    [imageData release];

    return copy;
}

image属性声明如下:

@property (nonatomic, retain) NSData *image;

这是一个仪器的截图,以证明我不是在撒谎。

Image snapshot

有人在那里看到问题吗?

3 个答案:

答案 0 :(得分:1)

泄漏工具可以显示物体的来源,而不是“泄漏”的位置。所以你的代码中的某个地方你会有这样的东西:

MyClass *obj = [otherObj copy]; // or copyWithZone:

但是你没有释放或自动释放obj因此造成泄漏。

在Objective-C中,约定告诉您一个方法应返回一个自动释放的对象,之外的方法以allocnewcopymutableCopy。这些方法必须返回保留的对象,接收者是所有者,因此负责释放它们。

请参阅Apple内存管理指南中的Memory Management Policy

答案 1 :(得分:1)

以下是我们按照here给出的说明解决问题的方法。

-(id) copyWithZone: (NSZone *) zone
{
    Layer *copy = [[Layer allocWithZone:zone]init];
    copy->_image=nil;
    [copy setImage:[self image]];
    return copy;
}

答案 2 :(得分:0)

- (id)copyWithZone:(NSZone *)zone{
    Layer *copy = [[[self class] allocWithZone: zone] init];
    [copy setImage:[self image]];

    return copy;
}