Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 触摸后UIButton retain计数器增加_Objective C_Ios_Memory Management_Memory Leaks_Retaincount - Fatal编程技术网

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
had
hideDeleteButton
。 我发现当我隐藏删除按钮(移除它)时,按下的按钮的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 member
deleteButton
。我认为我不需要为如此简单的情况创建属性……这没有问题,因为你要么是A)幸运的,要么是B)非常擅长在编写代码时在头脑中跟踪对象的保留/释放。您的
delete按钮
ivar取决于
self.view的状态以保持有效。这是一个脆弱的处境,你没有理由这么做。如果您想保留对
deleteButton
的引用,您应该保留自己。您不需要创建属性,但如果您是