NSData утечка памяти - PullRequest
       25

NSData утечка памяти

1 голос
/ 22 сентября 2011

Instruments показывает, что у меня есть утечка памяти:

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

    return copy;
}

Свойство изображения объявлено следующим образом:

@property (nonatomic, retain) NSData *image;

Вот скриншот инструментов, чтобы доказать, что я не лгу.

Image snapshot

Кто-нибудь видит там проблему?

Ответы [ 3 ]

1 голос
/ 22 сентября 2011

Инструменты «Утечки» показывают вам, откуда возник объект, а не где он «протек». Так что где-то в вашем коде у вас будет что-то вроде этого:

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

Но вы не выпускаете или не выпускаете автоматически obj и, следовательно, создаете утечку.

В Objective-C соглашение гласит, что метод должен возвращать объект с автоматическим освобождением, за исключением для методов, начинающихся с alloc, new, copy или mutableCopy. Этот метод должен возвращать оставленный объект, а получатель является владельцем и, таким образом, отвечает за их освобождение.

См. Политика управления памятью в руководстве по управлению памятью Apple.

1 голос
/ 03 октября 2011

Вот как мы решили это, следуя инструкциям здесь .

-(id) copyWithZone: (NSZone *) zone
{
    Layer *copy = [[Layer allocWithZone:zone]init];
    copy->_image=nil;
    [copy setImage:[self image]];
    return copy;
}
0 голосов
/ 22 сентября 2011
- (id)copyWithZone:(NSZone *)zone{
    Layer *copy = [[[self class] allocWithZone: zone] init];
    [copy setImage:[self image]];

    return copy;
}
...