2012-05-22 68 views
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];

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

回答

1

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

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

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

2)任何你应该保留在dealloc中释放出来,所以在dealloc中你应该

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

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

这样做了编辑>重构>转换成Objective C的ARC

+1

活动资源计数?你是在哪里拿到的?它是自动引用计数。 – Cyrille

-1

要么UIPickerView分配到_groupPicker(或任何实例变量被命名为) ,或者在分配值时使用autorelease

(问题是分配给一个保留的属性会导致保留,而且也已经在对象上保留从alloc。)

0

当心!当您设置像

self.property1 = x; 

属性和property1声明为保留,在property1上一个对象被释放,新的对象(x)被保留。这就是为什么要这样做:

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

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

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

这样,你给释放对象x到的“责任”财产持有人。

0

虽然使用的iOS5 +应用ARC应该是首选,如果你不想这样做,只是用autoreleaseinit方法。