Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
关于IPhone内存管理(自动释放)的说明_Iphone_Memory Management_Autorelease - Fatal编程技术网

关于IPhone内存管理(自动释放)的说明

关于IPhone内存管理(自动释放)的说明,iphone,memory-management,autorelease,Iphone,Memory Management,Autorelease,我知道以前也有人回答过类似的问题,但我只是想确保我能更好地理解它。这是我的场景 我有一个助手类方法,它返回一个分配的UIImageView,如下所示 +(UIImageView *)tableCellButton{ return [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]] autorelease]; } 然后,在我的一个UIViewController方法中,我使用它 UIImageView *imag

我知道以前也有人回答过类似的问题,但我只是想确保我能更好地理解它。这是我的场景

我有一个助手类方法,它返回一个分配的UIImageView,如下所示

+(UIImageView *)tableCellButton{
 return [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]] autorelease];
}

然后,在我的一个UIViewController方法中,我使用它

UIImageView *imageView = [Helper tableCellButton];
imageView.frame = cell.backgroundView.bounds;
imageView.tag = 250;
[cell.backgroundView addSubview:imageView];

我的问题是关于这个记忆是如何被释放的。我没有使用自动释放池(应用程序创建的池除外),并且该变量不是iVar/属性(因此在调用dealloc时它不会被释放)。在这种情况下,我是否负责在调用后释放内存?自动释放何时起作用?谢谢你的帮助

调用
autorelease
将导致
release
下次通过事件循环发送到对象。这将解释您在
tableCellButton
中进行的
alloc
调用。对象被保留的唯一其他时间是在
addSubview
内部,该视图还将处理同一对象自身的
release
。然后,根据上面的代码,您将签出此对象的内存管理。

运行循环的每个迭代都有自己的自动释放池

本质上,可以这样想:

while(1)
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    [someObject doSomething];
    [pool drain];
}

在这里看到这个问题,关于。希望这能给你一些启示。您永远不必
释放
自动释放的对象。
只有在按下按钮期间创建的“事件”中,或者只要
单元格,该事件才会持续存在。backgroundView
持续存在(
addSubview
保留。)就在释放的右侧。。。因此,我的应用程序中唯一的自动释放池是驻留在main中的池。既然如此,那么这是否会导致泄漏,或者当ViewController清理表格和单元格时,该对象是否会被发送释放?感谢您的回复!我还找到了iOS的内存管理文档(不知道我以前是怎么错过的)。当应用程序运行时,是否为每个事件创建了一个自动释放池,或者在main中只有一个全局池?每个事件。这意味着,当事件完成时,自动释放池被清空,并创建一个新池。在main中有一个自动释放池,但这基本上是程序结束前的最终捕获。