处理别人的代码。在分析项目时遇到了一段代码
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
也未在项目的任何地方发布。在这种情况下该怎么做?
我应该删除UIPicker
属性,而只是声明UIPicker
变量。
我应该发布像[_groupPicker release];
groupPicker的保留计数是什么,因为它在.h文件中保留一次,并再次分配,如上面的代码所示。
答案 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
已经保留了对象。)