Утечки памяти в UIB-кнопках неправильной формы - PullRequest
0 голосов
/ 10 октября 2010

Я знаю, что это длинный путь, но, поскольку мне нужен этот код, возможно, кто-то здесь может помочь.

Я использую код неправильной формы кнопок из CodeProject.com в одном из моих приложений для iPhone. Прекрасно работает, но Instruments сообщает о двух утечках памяти. Я использую код в стандартном UIViewController, но он находится внутри UINavigationController, в котором могут быть проблемы.

Первая утечка сообщается в методе myInit clickThruButton.m

- (void) myInit
{
    // Set so that any alpha > 0x00 (transparent) sinks the click
    uint8_t threshold = 0x00;
    self.alphaMask = [[AlphaMask alloc]  initWithThreshold: threshold]; 
    [self setMask];
}

Я могу увидеть релиз внизу, так что я не уверен, почему это произойдет:

- (void)dealloc
{
    [self.alphaMask release];
    [super dealloc];
}

Возможно, сначала нам нужно проверить, является ли self.alphaMast нулевым, прежде чем делать alloc?

Второй находится в конце метода calcHitGridFromCGImage в AlphaMask.m :

// COPIES buffer
// is AUTORELEASED!
// http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/
// MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH
NSData* ret = [NSData dataWithBytes: (const void *) dest 
                             length: (NSUInteger) destBytes ];

CGContextRelease (alphaContext);
free (alphaGrid);
free (dest);

return ret;

Утечка появляется в назначении NSData. Там нет alloc, new или copy, так где же утечка?

Я бы ДЕЙСТВИТЕЛЬНО был бы благодарен за любую помощь, которую вы могли бы оказать здесь. Я знаю, что это натянуто, но мне нужно, чтобы это работало как можно скорее. Спасибо!

ОБНОВЛЕНИЕ:

Полный источник можно найти по ссылке выше, но это может помочь прояснить определение alphaMask:

//
//  ClickThruButton.h
//  Test
//
//  Pi

@class AlphaMask;

@interface clickThruButton : UIButton 
{
    @private AlphaMask* _alphaMask;
}

@end

и ...

//
//  ClickThruButton.m
//  Test
//
//  Pi

#import "clickThruButton.h"
#import "AlphaMask.h"

@interface clickThruButton ()

@property (nonatomic, retain) AlphaMask* alphaMask;

- (void) myInit;
- (void) setMask;

@end

@implementation clickThruButton

@synthesize alphaMask = _alphaMask;

Ответы [ 2 ]

3 голосов
/ 10 октября 2010

(1)

Возможно, для свойства alphaMask установлено значение -retain.Это приводит к тому, что счетчик автоматически увеличивается на 1 при установке.Но [AlphaMask alloc] уже возвращает объект с счетом сохранения +1, поэтому общий счет хранения чрезмерно + 2.

Позже [self.alphaMask release] может только уменьшить счет хранения на 1, поэтому, в конце концов, счет не можетполучить 0 и освободить, т. е. память будет утечка.

Вы должны переписать это как

AlphaMask* mask = [[AlphaMask alloc]  initWithThreshold: threshold];
self.alphaMask = mask;
[mask release];        // cancel the retain.

(2)

ДонНе думаю, что в этом куске кода есть утечка.

0 голосов
/ 10 октября 2010

self.alphaMask = [[AlphaMask alloc] initWithThreshold: threshold]; скорее всего утечка.Не видя определения этого свойства, я не могу сказать наверняка.

...