Objective c 触摸后UIButton retain计数器增加
我正在创建一组相同自定义类型的对象。所有对象都有方法Objective c 触摸后UIButton retain计数器增加,objective-c,ios,memory-management,memory-leaks,retaincount,Objective C,Ios,Memory Management,Memory Leaks,Retaincount,我正在创建一组相同自定义类型的对象。所有对象都有方法showDeleteButtonhadhideDeleteButton。 我发现当我隐藏删除按钮(移除它)时,按下的按钮的retainCounter==2 代码如下: -(void)showDeleteButton { if(!isDeleteButtonLoaded) { // Check that method was't triggered twice UIButton *aDeleteButton = [[UIButton al
showDeleteButton
hadhideDeleteButton
。
我发现当我隐藏删除按钮(移除它)时,按下的按钮的retainCounter==2
代码如下:
-(void)showDeleteButton {
if(!isDeleteButtonLoaded) { // Check that method was't triggered twice
UIButton *aDeleteButton = [[UIButton alloc] initWithFrame:CGRectMake(-3, -7, 30, 29)]; // RC == 1
[aDeleteButton setImage:[UIImage imageNamed:@"close_button.png"] forState:UIControlStateNormal];
[self addSubview:aDeleteButton]; // RC == 2
[aDeleteButton addTarget:self action:@selector(deleteButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
deleteButton = aDeleteButton;
[aDeleteButton release]; // RC == 1
isDeleteButtonLoaded = YES;
NSLog(@"delete button retain count (created): %d", [deleteButton retainCount]);
[self setNeedsDisplay];
}
}
}
}
因此,对于按下的按钮,第二个方法中的NSLog显示RC==2!有什么想法吗?我百分之百确定deleteButton不能从课堂外访问 不要查看重新计数 嗯哼
对于任何一个理智的人来说,重新计算都是毫无意义的,只要你遵循记忆规则,事情就会好起来。不要看重新计算 嗯哼
对于任何一个理智的人来说,重新记数都是毫无意义的,只要你遵循记忆规则,事情就会顺利进行。永远不要查看重新记数来寻找任何有用的信息。在苹果的内部框架内,他们可以随时在你的对象上调用retain或release。你需要担心的是你的retain(或alloc,或copy)和release语句是否正确匹配。将一个视图添加为另一个视图的子视图(或将其添加到任何NSArray)也会增加其重新计数。。。不过,您不必担心这一点。永远不要查看保留帐户以获取任何有用的信息。在苹果的内部框架内,他们可以随时在你的对象上调用retain或release。你需要担心的是你的retain(或alloc,或copy)和release语句是否正确匹配。将一个视图添加为另一个视图的子视图(或将其添加到任何NSArray)也会增加其重新计数。。。不过你不必担心这一点。看看stackoverflow,看看为什么从不使用
retainCount
,而是使用Apple工具跟踪内存泄漏。看看stackoverflow,关于为什么从不使用retainCount
而是使用Apple工具跟踪内存泄漏。永远不要使用retainCount
。结果充其量只是误导
第一件事,去读吧
其次,使用这些准则修复代码中的一些内存问题:
UIButton *aDeleteButton = [[UIButton alloc] initWithFrame:CGRectMake(-3, -7, 30, 29)];
// Retain count +1
// Some code...
deleteButton = aDeleteButton;
[aDeleteButton release];
// Retain count -1
分配一个新的ui按钮
,然后释放它。这意味着该按钮不属于您,随时可能消失。我猜您的类中有一个名为deleteButton
的属性?如果是这样,请这样使用:self.deleteButton=aDeleteButton代码>
在hideDeleteButton
方法中,您可能希望使用如下所示的内容:
[self.deleteButton removeFromSuperview];
self.deleteButton = nil;
isDeleteButtonLoaded = NO;
[self setNeedsDisplay];
同样,这假设类中有一个名为deleteButton
的属性。如果你没有,做一个并使用它。它大大简化了内存管理任务。永远不要使用retainCount
。结果充其量只是误导
第一件事,去读吧
其次,使用这些准则修复代码中的一些内存问题:
UIButton *aDeleteButton = [[UIButton alloc] initWithFrame:CGRectMake(-3, -7, 30, 29)];
// Retain count +1
// Some code...
deleteButton = aDeleteButton;
[aDeleteButton release];
// Retain count -1
分配一个新的ui按钮
,然后释放它。这意味着该按钮不属于您,随时可能消失。我猜您的类中有一个名为deleteButton
的属性?如果是这样,请这样使用:self.deleteButton=aDeleteButton代码>
在hideDeleteButton
方法中,您可能希望使用如下所示的内容:
[self.deleteButton removeFromSuperview];
self.deleteButton = nil;
isDeleteButtonLoaded = NO;
[self setNeedsDisplay];
同样,这假设类中有一个名为deleteButton
的属性。如果你没有,做一个并使用它。它极大地简化了内存管理任务。想不出更好的答案:)您有没有任何迹象表明您正在泄漏按钮?如果没有,那么你就没有问题了。我想不出更好的答案:)你有没有任何迹象表明你正在泄露按钮?如果没有,那么你就没有问题了。我会补充一些解释。视图包含添加到UIScrollView的那些方法。在我显示删除按钮后,按下并隐藏它,我注意到在UIRollView中又出现了一个子视图-UIImageView。我确信我不会手动添加它。我检查了几次。没有addSubview:调用。所以我只是想说它可能是来自deleteButton的一些缓存数据…所以层次结构是:UIScrollView有3个MyCustomView(使用上面提到的方法)。MyCustomVew具有“可选”子视图deleteButton
。在UIScrollView中加载deleteButton
后,将显示另一个子视图,其中包含UIImageView类。。我正试图找出原因。我会补充一些解释。视图包含添加到UIScrollView的那些方法。在我显示删除按钮后,按下并隐藏它,我注意到在UIRollView中又出现了一个子视图-UIImageView。我确信我不会手动添加它。我检查了几次。没有addSubview:调用。所以我只是想说它可能是来自deleteButton的一些缓存数据…所以层次结构是:UIScrollView有3个MyCustomView(使用上面提到的方法)。MyCustomVew具有“可选”子视图deleteButton
。在UIScrollView中加载deleteButton
后,将显示另一个子视图,其中包含UIImageView类。。我正在试图找出原因。我的代码中没有任何问题。[self addSubview:aDeleteButton]增加retain counter,文档中提到了这一点。为什么它假设我有一个属性?我的代码中没有self.xxx语法。我只使用class memberdeleteButton
。我认为我不需要为如此简单的情况创建属性……这没有问题,因为你要么是A)幸运的,要么是B)非常擅长在编写代码时在头脑中跟踪对象的保留/释放。您的delete按钮
ivar取决于self.view的状态以保持有效。这是一个脆弱的处境,你没有理由这么做。如果您想保留对deleteButton
的引用,您应该保留自己。您不需要创建属性,但如果您是