1

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

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[_groupPicker release];

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

4

5 回答 5

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];
}
于 2012-05-22T13:44:37.823 回答
0

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

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

于 2012-05-22T13:33:14.950 回答
0

小心!当你设置一个属性时

self.property1 = x;

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

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

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

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

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

于 2012-05-22T13:36:28.493 回答
0

虽然应该首选将ARC用于 iOS5+ 应用程序,但如果您不想这样做,请使用autoreleaseafterinit方法。

于 2012-05-22T13:40:26.997 回答
-1

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

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

于 2012-05-22T13:33:24.110 回答