Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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 5和iOS 6在ARC下释放malloc-ed内存_Ios_Objective C_Memory_Malloc_Automatic Ref Counting - Fatal编程技术网

iOS 5和iOS 6在ARC下释放malloc-ed内存

iOS 5和iOS 6在ARC下释放malloc-ed内存,ios,objective-c,memory,malloc,automatic-ref-counting,Ios,Objective C,Memory,Malloc,Automatic Ref Counting,如何在ARC下释放Objective-C中动态分配的内存 我所说的动态是指用malloc分配给某个ivar的内存 dealloc和viewDidUnload不再被调用,至少在我的测试中是这样 那么当视图控制器不再需要时,何时以及如何开始释放内存 我所做的是创建了一个名为Releasable的协议,这是我从C中偷来的一个想法,它只有一个方法——void release。 当不再需要对象时,某些外部代理将调用该对象。在ARC下仍然调用dealloc。您只是没有显式地调用[super dealoc]。

如何在ARC下释放Objective-C中动态分配的内存

我所说的动态是指用malloc分配给某个ivar的内存

dealloc和viewDidUnload不再被调用,至少在我的测试中是这样

那么当视图控制器不再需要时,何时以及如何开始释放内存

我所做的是创建了一个名为Releasable的协议,这是我从C中偷来的一个想法,它只有一个方法——void release。 当不再需要对象时,某些外部代理将调用该对象。

在ARC下仍然调用dealloc。您只是没有显式地调用[super dealoc]。如果没有调用dealloc,那么某个对象仍然具有对该对象实例的引用。在您的项目上运行analyzer,看看会出现什么情况

viewDidUnload仍在iOS 5下调用,但在iOS 6下不调用


添加协议和发布方法是完全不必要的。

为什么要这样做?有了ARC,一旦不再有对它的任何引用,内存就可以分配。不需要手动处理此情况。不再调用viewDidUnload例程,因为iOS不再在didReceiveMemoryWarning上自动释放视图。甚至在iOS-6之前的日子里,只有当系统出现内存警告时才会调用viewDidUnload。就我个人而言,我倾向于为你的控制器使用dealoc方法调用你的免费调用。或者,更好的办法是,看看是否可以完全避免malloc调用。@Zekethegek我正在使用OpenGL ES 2.0并创建顶点。它们是纯C结构。由于我需要速度和空间,我不想将50000多个顶点打包到NSValue或类似的文件中。我一直在将NSLogs放入dealloc,但没有看到在应用程序端调用任何文件。我还要再检查一下。我还将运行analyzer.+1@rmaddy-顺便说一句,当iOS 5中调用viewDidUnload时,我认为他的评论代表了一种误解。他的评论似乎表明,当观点被驳回时,他认为这是一个普遍的清理程序,但正如你所知,事实并非如此。它是一个特殊用途的例程,用于在内存不足的情况下释放控制器的视图,但在标准操作中,当视图被取消/弹出时,它不会被调用。@MartinBerger如果您的dealloc例程没有被调用,那么您可能有保留循环强引用循环,例如,在不使重复NSTimer无效或呈现控制器保留(即保持对呈现控制器的强引用)时,您可以获得。但Dealoc绝对是你清理垃圾的好地方。你只需要弄清楚为什么它没有被调用,如果它没有被调用。@Rob我对调用viewDidUnload的时间没有误解。我只是指出,在iOS 6下,它不再被称为。我留下了iOS 5下实际调用它的详细信息,作为读者的练习:如果您指的是应用程序终止,那么您很可能不会看到在应用程序端调用任何[dealloc方法],因为如果应用程序即将终止,那么调用dealloc方法毫无意义,因为系统将回收所有资源。