Ios 我如何清理我的记忆?
我有一个图像处理应用程序,用于测试iOS上块/线程的潜在加速。该算法运行良好,使用了相当数量的内存,然后在运行后将其转储 我制作了一个测试套件,按顺序运行算法10次,使用并行实现运行算法10次。如果我试着在手机上运行它,它会因为内存压力而崩溃——最终需要432MB的内存。然而,一旦套件完成,所有的东西最终都会被清理干净:/ 每次运行都使用大约25MB的内存。因此,我认为解决方案是在每次运行后重置所有对象,然后将它们清理干净。我基本上有两个处理对象来完成我所有的工作。所以在每次运行之后,我认为将它们设置为nil会导致它们被重新创建,旧版本被销毁,内存被释放。然而,这对我的记忆使用没有影响 我还需要做些什么来释放通话之间的内存吗?我认为Objective-C现在正在使用引用计数,一旦我消除了viewController中唯一的引用,它就会被释放。如有任何建议,将不胜感激 这是我尝试释放内存的测试套件算法:Ios 我如何清理我的记忆?,ios,iphone,objective-c,memory,Ios,Iphone,Objective C,Memory,我有一个图像处理应用程序,用于测试iOS上块/线程的潜在加速。该算法运行良好,使用了相当数量的内存,然后在运行后将其转储 我制作了一个测试套件,按顺序运行算法10次,使用并行实现运行算法10次。如果我试着在手机上运行它,它会因为内存压力而崩溃——最终需要432MB的内存。然而,一旦套件完成,所有的东西最终都会被清理干净:/ 每次运行都使用大约25MB的内存。因此,我认为解决方案是在每次运行后重置所有对象,然后将它们清理干净。我基本上有两个处理对象来完成我所有的工作。所以在每次运行之后,我认为将
- (void)runTestSuite
{
// Sequential
NSLog(@"Sequential Run: ");
for (int i = 0; i < 10; i++) {
self.imageView.image = self.startImage;
self.imageManipulator = nil;
self.objectRecognizer = nil;
for (UIView *view in self.gameView.subviews) {
[view removeFromSuperview];
}
[self processImageInParallel:NO];
}
[self printResults];
[self clearResults];
// Parallel
NSLog(@"Parallel Run: ");
for (int i = 0; i < 10; i++) {
self.imageView.image = self.startImage;
self.imageManipulator = nil;
self.objectRecognizer = nil;
for (UIView *view in self.gameView.subviews) {
[view removeFromSuperview];
}
[self processImageInParallel:YES];
}
[self printResults];
[self clearResults];
}
-(void)runTestSuite
{
//连续的
NSLog(@“顺序运行:”);
对于(int i=0;i<10;i++){
self.imageView.image=self.startImage;
self.imageManipulator=nil;
self.objectRecognizer=nil;
用于(在self.gameView.subview中的UIView*视图){
[视图从SuperView移除];
}
[自处理图像并行:否];
}
[自行打印结果];
[自我澄清结果];
//平行的
NSLog(@“并行运行:”);
对于(int i=0;i<10;i++){
self.imageView.image=self.startImage;
self.imageManipulator=nil;
self.objectRecognizer=nil;
用于(在self.gameView.subview中的UIView*视图){
[视图从SuperView移除];
}
[自处理图像并行:是];
}
[自行打印结果];
[自我澄清结果];
}
一些源代码会有所帮助。若并没有,一般建议是:将执行图像处理的代码包装在autoreleasepool中(请参阅)
这将尽快丢弃临时对象,减少内存峰值。除了改进算法以提高内存使用率之外,您还可以尝试一下@autoreleasepool
。这将释放在每个循环之间使用的可释放对象,而无需结束当前循环周期
for (int i = 0; i < 10; i++) {
@autoreleasepool {
}
}
for(int i=0;i<10;i++){
@自动释放池{
}
}
从:
在许多情况下,允许临时对象累积到
当前事件循环迭代的结束不会导致过度的
开销但是,在某些情况下,您可能会创建大量
大量增加内存占用的临时对象,以及
你想更快地处理掉的。在后一种情况下,您可以
可以创建自己的自动释放池块。在街区的尽头,
临时对象将被释放,这通常会导致
取消分配,从而减少程序的内存占用
应该在这里使用
许多程序创建自动删除的临时对象。这些
对象添加到程序的内存占用空间中,直到
块在许多情况下,允许临时对象累积
直到当前事件循环结束,迭代不会导致
管理费用过高;但是,在某些情况下,您可能会创建
大量临时对象,这些临时对象大大增加了内存
您希望更快速地处理的足迹。在这些
在后一种情况下,您可以创建自己的自动释放池块。在
块结束时,将释放临时对象,通常
结果导致它们的释放,从而减少程序的内存
足迹
-(void)runTestSuite
{
//连续的
NSLog(@“顺序运行:”);
对于(int i=0;i<10;i++){
@自动释放池
{
self.imageView.image=self.startImage;
self.imageManipulator=nil;
self.objectRecognizer=nil;
用于(在self.gameView.subview中的UIView*视图){
[视图从SuperView移除];
}
[自处理图像并行:否];
}
}
[自行打印结果];
[自我澄清结果];
//平行的
NSLog(@“并行运行:”);
对于(int i=0;i<10;i++){
@自动释放池
{
self.imageView.image=self.startImage;
self.imageManipulator=nil;
self.objectRecognizer=nil;
用于(在self.gameView.subview中的UIView*视图){
[视图从SuperView移除];
}
[自处理图像并行:是];
}
}
[自行打印结果];
[自我澄清结果];
}
您可以共享任何相关代码吗?@Merlevede我不确定它是否有用,但我已经在testSuite中编辑过。我可以理解内存问题,因为imageManipulator
和objectRecognizer
具有完整的图像像素数据数组。我希望删除引用可以清除它们。您可以将代码发布到processImageInParallel:
方法吗?每个图像有多大?就是这样,谢谢!现在它的最大容量约为90MB,我可以管理和使用它。
- (void)runTestSuite
{
// Sequential
NSLog(@"Sequential Run: ");
for (int i = 0; i < 10; i++) {
@autoreleasepool
{
self.imageView.image = self.startImage;
self.imageManipulator = nil;
self.objectRecognizer = nil;
for (UIView *view in self.gameView.subviews) {
[view removeFromSuperview];
}
[self processImageInParallel:NO];
}
}
[self printResults];
[self clearResults];
// Parallel
NSLog(@"Parallel Run: ");
for (int i = 0; i < 10; i++) {
@autoreleasepool
{
self.imageView.image = self.startImage;
self.imageManipulator = nil;
self.objectRecognizer = nil;
for (UIView *view in self.gameView.subviews) {
[view removeFromSuperview];
}
[self processImageInParallel:YES];
}
}
[self printResults];
[self clearResults];
}