Я знаю, что это длинный путь, но, поскольку мне нужен этот код, возможно, кто-то здесь может помочь.
Я использую код неправильной формы кнопок из 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;