2011-03-29 95 views
0

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

- (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?
感谢您的帮助

回答

5

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

  1. 属性应始终设置为 的autorelease d对象或 对象,你会在你的 自己被释放。
  2. 永远不要直接发送到一个属性发布。如果可能,我倾向于发布潜在变量(例如:[_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

+1,但我想补充一点,你的财产需要*保留*或*复制*,而不是*分配*(这真的应该在这种情况下)。 – Eiko 2011-03-29 13:53:11

+0

这是真的,我假设这是至少保留,因为他得到了内存泄漏报告。你的属性看起来应该类似于@property(retain)NSMutableArray * uiValueSubviews'; – Joe 2011-03-29 13:55:24

+0

谢谢,该死的我从来没有想过(保留)在我的房产中,我猜我必须改变更多:) – Seega 2011-03-29 14:16:38

1

你应该这样做:

- (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大概是保留财产,所以当你的alloc,你retainCount是+1和自我。 +1。

1

的其他办法,避免自动释放的对象,应该是:

// ... 
if (self.uiValueSubviews == nil) 
{ 
    NSMutableArray *uiValueSubviews_tmp = [[NSMutableArray alloc] init]; 
    // maybe do something with uiValueSubviews_tmp 
    self.uiValueSubviews = uiValueSubviews_tmp; 
    [uiValueSubviews_tmp release]; 
} 
// .... 

据我所知,这是苹果公司是如何做的在他们的例子。