initWithFrame 中的内存泄漏

Posted

技术标签:

【中文标题】initWithFrame 中的内存泄漏【英文标题】:Memory Leak in initWithFrame 【发布时间】:2011-03-29 13:42:06 【问题描述】:

我使用带有其他视图的 NSMutableArray 的 UIView 子类将值指示为条形。 我在我的 initWithFrame 中初始化它。在创建和删除我的 UIView 子类几次后,仪器告诉 NSMutableArray 的分配存在泄漏。 这就是为什么我用 if 框住它以避免多个对象。但没有帮助

- (id) initWithFrame :(CGRect)frame

self = [super initWithFrame:frame];
if (self.uiValueSubviews == nil)
    self.uiValueSubviews = [[NSMutableArray alloc]init];

return self;


- (void)dealloc 
[self.uiValueSubviews release];
[super dealloc];

我的 dealloc 有什么问题吗?感谢您的帮助

【问题讨论】:

【参考方案1】:

我发现内存管理涉及您的财产的两个问题。

    属性应始终设置为 autoreleased 对象或 您将在您的 拥有。 切勿将授权书直接发送给财产。如果可能的话,我更喜欢释放底层变量(例如[_uiValueSubviews release];

将代码更改为以下内容。

- (id) initWithFrame :(CGRect)frame

    self = [super initWithFrame:frame];
    if (self.uiValueSubviews == nil)
        //Set to autoreleased array
        self.uiValueSubviews = [NSMutableArray array];
    
    return self;


- (void)dealloc 
    //nil the value
    self.uiValueSubviews = nil;
    [super dealloc];

【讨论】:

+1,但我想补充一点,您的属性需要 retaincopy,而不是 assign (在这种情况下确实应该如此)。 这是真的,我假设它至少是保留,因为他报告了内存泄漏。您的属性应该类似于@property(retain) NSMutableArray *uiValueSubviews; 谢谢,该死的我从没想过(保留)我的属性,我想我必须改变更多:)【参考方案2】:

你应该这样做:

- (id) initWithFrame :(CGRect)frame

   if ((self = [super initWithFrame:frame]))
   
     if (self.uiValueSubviews == nil)
         uiValueSubviews = [[NSMutableArray alloc]init];
   
   return self;


- (void)dealloc 

   self.uiValueSubviews = nil;
   [super dealloc];

你的 uiValueSubviews 可能是一个保留属性,所以当你分配时,你的 retainCount 是 +1 和 self.也 +1。

【讨论】:

【参考方案3】:

另一种避免自动释放对象的方法是:

// ...
if (self.uiValueSubviews == nil)

    NSMutableArray *uiValueSubviews_tmp = [[NSMutableArray alloc] init];
    // maybe do something with uiValueSubviews_tmp
    self.uiValueSubviews = uiValueSubviews_tmp;
    [uiValueSubviews_tmp release];

// ....

据我所知,Apple 在他们的示例中就是这样做的。

【讨论】:

以上是关于initWithFrame 中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

如何防止java中的内存泄漏

Icarousel 内存泄漏中的泄漏

如何检查 C++ 代码中的内存泄漏。有没有检查内存泄漏的免费工具[重复]

Java中的内存泄漏

Java中的内存泄漏问题

NSMutableDictionary 中的内存泄漏