Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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
仪表显示内存泄漏-Xcode 5/iOS7_Ios_Objective C_Xcode_Instruments - Fatal编程技术网

仪表显示内存泄漏-Xcode 5/iOS7

仪表显示内存泄漏-Xcode 5/iOS7,ios,objective-c,xcode,instruments,Ios,Objective C,Xcode,Instruments,我有以下代码: NSString *bgImageName = [[Useful instance] getRootviewBackgroundImageName]; UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:bgImageName]]; imageView.clipsToBounds = YES; CGRect rc = CGRectMake(0, 0, self.view.f

我有以下代码:

NSString *bgImageName = [[Useful instance] getRootviewBackgroundImageName];
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:bgImageName]];
imageView.clipsToBounds = YES;
CGRect rc = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[imageView setFrame:rc];
[self.view insertSubview:imageView atIndex:0];
[imageView release];
在上面的代码中,Instruments在第二行显示100%的内存泄漏,而在xcode 4.6中则不是这样。我现在正在osx 10.8.5上使用xCode 5

看起来,我正确地释放了分配的
UIImageView
(第7行),它被插入到我的视图的第6行,所以我不明白为什么intruments会出现内存泄漏警告

有人知道为什么instuments(在我看来)会给出错误的信息吗

编辑:这是仪器屏幕截图和我泄漏对象的分配摘要:

UIKit
和QuartzCore保留了我的对象,这就是我泄漏
UIImageView
的原因(或者我的假设是错误的?)


UIImageView
被插入到视图(一个
UIViewController
)中,该视图在我的xib文件中引用。如何控制添加到“self.view”后我添加的
UIImageView
发生了什么?

Instruments显示了触发泄漏对象分配的代码行,而不是对象实际泄漏的原因。启用引用计数跟踪并查看该图像视图上的所有保留/释放事件。将有一个额外的retain(或丢失的版本)。

我注意到这发生在您的
RootViewController
实例上。这真的是顶级视图控制器吗(例如,一个您永远不会忽略/弹出的控制器)?如果是这样的话,这个摘要会正确地告诉您图像视图仍然存在,奇怪的是它被报告为泄漏

但是,如果视图控制器被解除,那么您就有一个真正的漏洞(尽管问题不在于您问题中的代码:您做得正确)。您的分配摘要证明您的
UIImageView
永远不会被销毁。如果视图控制器已正确解除并解除分配,则图像视图的分配摘要应如下所示:

注意,当我弹出视图控制器(在我的评测会话中为28秒)时,视图被释放,因此
UIImageView
也被释放(请参见突出显示的两行)

您可以从分配摘要中得出两个结论:

  • 它不会在您的
    UIImageView上显示任何其他保留,这表明此图像视图根本不是问题所在。并非您意外地在某处过度保留了此图像视图

  • 您没有看到从superview中移除的
    这一事实表明,您的
    superview本身永远不会被释放

因此,问题是您的
RootViewController
是否已从视图控制器层次结构中删除。如果是这样,则可能是视图控制器本身的泄漏或保留周期,而不是此图像视图


顺便说一句,听起来你对这些主题已经很熟悉了,但我经常让人们看WWDC 2012视频,它不仅描述了许多内存问题,还演示了如何使用工具来跟踪这些问题(例如,显著的堆照片)。

我开始遇到同样的问题,我正在查看ImageName。我发现过去有记忆问题。我最终使用了[[UIImage alloc]initWithContentsOfFile:actualPath],其中actualPath来自主捆绑包。

iOS 7上的Xcode 5也有同样的问题。经过一些实验后,我注意到,当运行iOS 6.1模拟器或运行iOS 7的设备(iPhone 5s)时,仪器没有显示内存泄漏。基于这些,我只能得出结论,这是一个误报,是iOS7模拟器中的一个错误


编辑:在我更新到Xcode 5.0.1和OS X Mavericks之后,这个问题就不再出现了(我猜这是第一个修复了它,但不能确定)。

我认为@mishod有正确的答案

我测试过,是的UIImageView设置图像确实泄漏

如果您使用

   [yourImageView setImage:[UIImage imageNamed:@"sampleImage.png"]];
您可以看到仪器上的内存使用率正在增加。 这似乎是一种缓存,从那以后就开始了 在所有图像中循环,内存使用将趋于平稳

正确的,或至少是非泄漏的方法是:

   NSString *thePath = [[NSBundle mainBundle] pathForResource:@"sampleImage" ofType:@"png"];
   UIImage *newImage =  [[UIImage alloc] initWithContentsOfFile:thePath];
   [yourImageView setImage:newImage];
我在我的代码上验证了这一点,因为我的应用程序循环了很多次
大的图像文件。

只是一个建议。不要在模拟器上运行仪器。在设备上执行此操作。差异很大,您可以看到更好的/相关的结果。模拟器的内存比实际设备的内存多得多。

泄漏了什么对象?“UIImageView”对象我也有类似的东西,我只在模拟器[imageview setImage:[UIImageName:@”img中看到过-568h@2x"]]; (此处泄漏)我使用的是arc xcode 5 ios7@dave只有在使用模拟器对iOS 7进行评测时,才会出现泄漏。使用设备或模拟器对所有iOS版本进行评测时不会出现任何memoryleak警告(参见Dan Marinescu的回答),谢谢您的帮助,但我仍然无法清除仪器中泄漏的对象。请看一下我编辑的问题,我也得出了同样的结论。现在将提交我的应用:)谢谢大家的帮助!