分配财产

时间:2012-05-22 13:29:57

标签: iphone ios memory-management memory-leaks

处理别人的代码。在分析项目时遇到了一段代码

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

  3. 这样的groupPicker

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

5 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

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

这样做必须编辑>重构>转换为目标c ARC

答案 2 :(得分:0)

小心!当您设置类似

的属性时
self.property1 = x;

并将property1声明为retain,释放property1中的上一个对象并保留新对象(x)。这就是为什么这样做:

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

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

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

通过这种方式,您可以将对象x的“责任”赋予属性持有者。

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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

(问题是分配到保留属性会导致保留,并且alloc已经保留了对象。)