2010-10-09 44 views
0

我知道这是一个长效的,但由于我需要此代码才能工作,也许这里有人可以提供帮助。不规则形状的UIButton中的内存泄漏

我在我的一个iPhone应用程序中使用CodeProject.com中的Irregularly Shaped Buttons代码。很好用,但是Instruments报告了两次内存泄漏。我在一个标准的UIViewController中使用了代码,但这是在UINavigationController中,这可能是问题所在。

第一泄漏报告在clickThruButton.m的myInit方法

- (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结束:出现在NSData的分配

// 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; 

泄漏。没有分配,新的或复制,那么泄漏的位置在哪里?

我会真的感谢您可以在这里提供的任何帮助。我知道这是一个延伸,但我需要这个尽快工作。谢谢!

更新:

完整的源代码可以在上面的链接中找到,但是这可能会帮助清理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; 

回答

3

(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

太棒了!我*认为*修正了它。谢谢! – Axeva 2010-10-09 21:41:44

0

self.alphaMask = [[AlphaMask alloc] initWithThreshold: threshold];可能是泄漏。如果没有看到该财产的定义,我不能肯定地说。