initWithFrame中的内存泄漏

时间:2011-03-29 13:42:06

标签: iphone objective-c memory-leaks

我使用带有其他视图的NSMutableArray的UIView子类来将值指示为条形 我在initWithFrame中初始化它。仪器告诉我创建和删除我的UIView子类之后,NSMutableArray的alloc有一个泄漏。
这就是为什么我用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做错了什么? 感谢您的帮助

3 个答案:

答案 0 :(得分:5)

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

  1. 应始终将属性设置为 一个autorelease d对象或 你要释放的对象 自己的。
  2. 切勿直接向物业发送。如果可能,我更愿意发布基础变量(例如[_uiValueSubviews release];
  3. 将代码更改为以下内容。

    - (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)

你应该这样做:

- (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也是。

答案 2 :(得分:1)

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

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

据我所知,Apple就是这样做的例子。

相关问题