【问题标题】:Allocating a property分配财产
【发布时间】:2012-05-22 13:29:57
【问题描述】:

处理别人的代码。分析项目时偶然发现一段代码

self.groupPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0,260,320,216)];
self.groupPicker.delegate = self;
self.groupPicker.showsSelectionIndicator = YES;
[self.view addSubview:self.groupPicker];

其中 groupPicker 是 UIPicker 属性。在分析项目时,我在这种情况下遇到了潜在的泄漏警告。我还注意到dealloc 方法中没有释放 groupPicker 属性。 _groupPicker 也没有在项目的任何地方发布。这种情况应该怎么办?

  1. 我是否应该删除 UIPicker 属性并只声明一个 UIPicker 变量。

  2. 我应该像[_groupPicker release];那样发布groupPicker吗?

groupPicker 的保留计数是多少,因为它在 .h 文件中保留一次并再次分配,如上面的代码所示。

【问题讨论】:

    标签: iphone ios memory-management memory-leaks


    【解决方案1】:

    1) 不,拥有财产完全没问题,问题是它被过度保留了。当您分配/初始化时,保留计数为 1,然后您使用保留属性再次增加保留计数。保留计数现在为 2,假设您在 dealloc 中释放对象,最终保留计数为 1,即泄漏的对象。

    有很多方法可以解决这个问题。我认为最好的方法是在初始化时自动释放对象。像这样

    self.groupPicker = [[[UIPickerView alloc] initWithFrame:CGRectMake(0,260,320,216)] autorelease];
    

    2)你保留的任何东西都应该在dealloc中释放,所以你应该在dealloc中

    - (void)dealloc {
        [_groupPicker release];
        [super dealloc];
    }
    

    【讨论】:

      【解决方案2】:

      小心!当您设置类似的属性时

      self.property1 = x;
      

      并且property1被声明为retain,property1中的前一个对象被释放,新的对象(x)被保留。这就是这样做的原因:

      self.property1 = [[x alloc] init];
      

      当property1 被声明为retain 时,将保留x 两次。 (一个用于初始化,一个用于设置属性) 正确的方法是声明对象,设置属性,然后释放

      object x = [[class alloc] init];
      self.property1 = x;
      [x release];
      

      这样,您将释放对象 x 的“责任”交给了属性持有者。

      【讨论】:

        【解决方案3】:

        虽然应该首选将 ARC 用于 iOS5+ 应用程序,但如果您不想这样做,只需在 init 方法之后使用 autorelease

        【讨论】:

          【解决方案4】:

          您应该使用 ARC(自动引用计数)

          为此必须编辑>重构>转换为目标 c ARC

          【讨论】:

          • 活动资源计数?你是在哪里拿到的?这是自动引用计数。
          【解决方案5】:

          要么将 UIPickerView 分配给 _groupPicker(或任何命名的实例变量),要么在分配时在值上使用 autorelease

          (问题是分配给保留属性会导致保留,并且对象上已经存在来自alloc 的保留。)

          【讨论】:

            猜你喜欢
            • 2017-03-20
            • 1970-01-01
            • 1970-01-01
            • 2011-04-09
            • 2013-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-09
            相关资源
            最近更新 更多