Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.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 返回主视图时,如何从内存中删除子视图?_Ios_Xcode_Uiviewcontroller - Fatal编程技术网

Ios 返回主视图时,如何从内存中删除子视图?

Ios 返回主视图时,如何从内存中删除子视图?,ios,xcode,uiviewcontroller,Ios,Xcode,Uiviewcontroller,假设我有一个主视图,当我点击一个按钮时,它将加载一个子视图并让该子视图启动手电筒(LED),然后当我返回主视图时,它将释放该子视图并关闭手电筒(LED) 现在,当我关闭子视图时,它应该将其从内存中释放并停止手电筒 - (void)viewDidUnload { [self.view removeFromSuperview]; [self autorelease]; [AVSession stopRunning]; [AVSession release], AVSe

假设我有一个主视图,当我点击一个按钮时,它将加载一个子视图并让该子视图启动手电筒(LED),然后当我返回主视图时,它将释放该子视图并关闭手电筒(LED)

现在,当我关闭子视图时,它应该将其从内存中释放并停止手电筒

- (void)viewDidUnload
{
    [self.view removeFromSuperview];
    [self autorelease];
    [AVSession stopRunning];
    [AVSession release], AVSession = nil;
    [super viewDidUnload];
}

但是viewDidUnload不起作用,请告诉我我做错了什么。

可能是您保留了视图控制器,并且它决定将视图保留在内存中,以防您的应用程序决定再次显示它(这是Caleb在评论中提到的缓存)。视图不可见并不意味着它将被卸载

如果您有内存泄漏(这里我指的是VC),显然修复它是有意义的


但是,我认为您启用和禁用手电筒的最佳选择是在ViewDidDisplay和ViewDidEnglish(或其..will..变体)中启用和禁用手电筒。

很可能您保留了视图控制器,并且它决定将视图保留在内存中,以防您的应用程序决定再次显示它(这是Caleb在评论中提到的缓存)。视图不可见并不意味着它将被卸载

如果您有内存泄漏(这里我指的是VC),显然修复它是有意义的


但是,我认为启用和禁用手电筒的最佳选择是在ViewDidDisplay和ViewDidEnglish(或其..will..变体)中启用和禁用手电筒。

问题在于您误解了使用手电筒的目的

只有在系统试图释放内存时,才会在内存不足的情况下调用
-viewDidUnload
。在这种情况下,非活动视图控制器将释放其视图并调用
-viewDidUnload
,以便您可以释放任何与视图相关的资源

当视图控制器变为非活动状态或释放视图控制器时,不要指望调用
-viewDidUnload

您的视图控制器可能知道AVSession应该在什么时候结束,并且它可以随时结束会话

顺便说一下,您的
-viewDidUnload
从未运行过;调用
[self autorelease]是件好事
可能会导致崩溃。为什么要这样做?您显示的代码是视图控制器的一部分。我不知道该类的名称,所以我可以想象它是
FlashlightViewController
。可能是其他视图控制器正在实例化FlashlightViewController并以某种方式使其处于活动状态,就像这样s:

FlashlightViewController *fvc = [[FlashlightViewController alloc] initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:fvc];
[fvc release];
这里,导航控制器在按下时将保留
fvc
,创建fvc的控制器将释放它,因为它不再需要对新控制器的引用。当手电筒控制器完成其工作并弹出导航堆栈时,导航控制器将释放它。因为没有该对象保留了闪光灯控制器,它将自动解除分配。发生这种情况时,它将释放其视图,并且由于没有其他对象保留该视图,因此该视图也将解除分配


情况的细节可能不同,但想法总是一样的:释放视图控制器后,视图控制器和视图都将从内存中删除。

问题在于您误解了视图控制器的用途

只有在系统试图释放内存时,才会在内存不足的情况下调用
-viewDidUnload
。在这种情况下,非活动视图控制器将释放其视图并调用
-viewDidUnload
,以便您可以释放任何与视图相关的资源

当视图控制器变为非活动状态或释放视图控制器时,不要指望调用
-viewDidUnload

您的视图控制器可能知道AVSession应该在什么时候结束,并且它可以随时结束会话

顺便说一下,您的
-viewDidUnload
从未运行过;调用
[self autorelease]是件好事
可能会导致崩溃。为什么要这样做?您显示的代码是视图控制器的一部分。我不知道该类的名称,所以我可以想象它是
FlashlightViewController
。可能是其他视图控制器正在实例化FlashlightViewController并以某种方式使其处于活动状态,就像这样s:

FlashlightViewController *fvc = [[FlashlightViewController alloc] initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:fvc];
[fvc release];
这里,导航控制器在按下时将保留
fvc
,创建fvc的控制器将释放它,因为它不再需要对新控制器的引用。当手电筒控制器完成其工作并弹出导航堆栈时,导航控制器将释放它。因为没有该对象保留了闪光灯控制器,它将自动解除分配。发生这种情况时,它将释放其视图,并且由于没有其他对象保留该视图,因此该视图也将解除分配


情况的细节可能不同,但想法总是一样的:释放视图控制器后,视图控制器和视图都将从内存中删除。

如何返回主视图?如何返回主视图?除非出现内存警告,否则视图控制器通常不会卸载其视图。视图控件除非有内存警告,否则ller通常不会卸载其视图。然后是从内存中删除子视图的任何其他方法。然后是从内存中删除子视图的任何其他方法。为什么要将AVSession业务与视图是否在内存中联系起来?视图控制器通常会将其视图保留在内存中,除非有理由不这样做,就像它延迟加载一样视图将一直保留到需要时为止。如果要在视图消失时结束会话,请使用-viewWillEnglish或-viewDidEnglish,并显示相应的-view[Will | Did]来创建会话。谢谢,它正在工作。Bu