Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.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
Ios 我是否负责发布UIView';dealloc中的手势识别器?_Ios_Uigesturerecognizer_Memory Management - Fatal编程技术网

Ios 我是否负责发布UIView';dealloc中的手势识别器?

Ios 我是否负责发布UIView';dealloc中的手势识别器?,ios,uigesturerecognizer,memory-management,Ios,Uigesturerecognizer,Memory Management,我已将UIGestureRecognitor附加到UIView。谁有责任在dealloc期间发布此文件 具体而言: UITapGestureRecognizer *t = [[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapHandler:)]; [self.view addGestureRecognizer:t]; [t release]; 因此,self.view目前仅保留手势识别器

我已将UIGestureRecognitor附加到UIView。谁有责任在dealloc期间发布此文件

具体而言:

UITapGestureRecognizer *t = 
[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapHandler:)];

[self.view addGestureRecognizer:t];
[t release];
因此,self.view目前仅保留手势识别器

更新 我应该说得更清楚些。我的问题与views dealoc方法有关。释放视图时,视图的超类是否处理GestureRecognitor的释放。我目前认为情况就是这样

您的代码是正确的

该视图通过
[self.view addgesturecognizer:t]
获得手势识别器的所有权

创建代码时,您可以通过自动删除
t
来整理代码:

UITapGestureRecognizer *t = [[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapHandler:)] autorelease];
[self.view addGestureRecognizer:t];

这意味着
t
的所有所有权都在一个地方处理,从而减少了在代码被修改时引入问题的可能性。

经验法则是,无论何时调用
alloc
new
copy
,您都会调用
release

因为您调用了alloc,所以您的代码没有过度释放或泄漏任何内容


虽然您可以自动释放手势识别器,但我不会,因为在可能的情况下,显式释放对象是更好的内存管理。(自动释放的对象在自动释放池耗尽之前不会释放。)

对所有对象调用自动释放而不是自己释放它们不是一个好习惯。@Tieme我不同意。它将所有内存管理代码保存在一个位置,从而提高可读性,从而减少因忘记发布而导致泄漏的可能性。延迟释放不会影响内存高水位线,因为无论如何,在该方法退出后,对象将保持不变。你说使用自动释放不是一个好习惯的原因是什么?我同意你这个例子。在这里,可以调用自动释放。但总是自动释放对象仍然不是一个好习惯,因为最终会给内存管理增加一些开销。@Tieme这是过早的优化。自动释放简化了内存管理,从而减少了可能出现的bug。最好使用autorelease,直到您能够证明它的使用导致了问题。在我使用Objective-C的5年时间里,我很少想到autorelease会引起问题(我想到的是早期iOS设备上的图像处理)。我通过在有问题的代码周围添加自动释放池来解决这些问题,而不是承担内存管理的负担