在Mac和iOS平台上,内存泄漏通常是由未发布的指针引起的.传统上,检查您的分配,副本和保留以确保每个都有相应的发布消息始终是至关重要的.
Xcode 4.2附带的工具链引入了最新版本的LLVM编译器的自动引用计数(ARC),通过让编译器为您的内存管理来完全解决这个问题.这非常酷,它确实减少了大量不必要的,平凡的开发时间,并防止了很多粗心的内存泄漏,这些泄漏很容易通过适当的保留/释放平衡来修复.当您为Mac和iOS应用程序启用ARC时,甚至需要以不同方式管理自动释放池(因为您不应再分配自己的NSAutoreleasePools).
但是,其他的内存泄漏它不能阻止我仍然要注意?
作为奖励,Mac OS X和iOS上的ARC与Mac OS X上的垃圾收集有什么区别?
有人可以简单地向我解释ARC是如何工作的吗?我知道它与垃圾收集不同,但我只是想知道它是如何工作的.
此外,如果ARC在没有阻碍性能的情况下完成GC的工作,那么为什么Java使用GC?为什么不使用ARC呢?
cocoa-touch garbage-collection objective-c automatic-ref-counting
我还没有使用ARC,因为我正在研究的项目中的大部分代码都是在iOS 5.0之前编写的.
我只是想知道,手动保留/释放的便利性(以及可能因此产生的更可靠的代码?)是否超过使用ARC的任何"成本"?您对ARC有什么经历,您会推荐它吗?
所以:
Python使用引用计数方法来处理对象的生命周期.因此,不再使用的对象将立即被销毁.
但是,在Java中,GC(垃圾收集器)会销毁在特定时间不再使用的对象.
为什么Java选择这种策略,这有什么好处?
这比Python方法更好吗?
我正在构建照片书布局应用程序.应用程序经常将JPEG图像解压缩到内存位图缓冲区中.图像的大小限制在100万像素(而它们通常不超过1500万像素).
有时这些缓冲区的内存分配失败:[[NSMutableData alloc] initWithLength:]返回nil.这似乎发生在系统的自由物理内存接近零的情况下.
我的理解在Mac OS X中的虚拟内存系统是在64位进程的分配实际上(原文如此),不能失败.有16个exabyte的地址空间,我试图一次分配最多400兆字节.从理论上讲,我可以分配400亿个缓冲区而不会遇到可用地址空间的硬限制.当然,实际限制会阻止这种情况,因为交换空间受启动卷大小的限制.实际上,我只做了很少的这些分配(少于10个).
我不明白的是,无论物理内存有多低,分配都会失败.我认为 - 只要有交换空间,内存分配就不会失败(因为此时页面甚至没有映射).
该应用程序是垃圾收集.
编辑:
我有时间进一步深入研究这个问题,这是我的发现:
NSMutableData失败时,普通malloc仍然可以成功分配相同数量的内存.我假设NSData用于NSAllocateCollectable执行分配而不是malloc在垃圾收集下运行时.
我的结论是,当物理内存很低时,收集器无法分配大块内存.再一次,我不明白.
我的应用程序使用石英过滤器将PDF文档中的图像转换为黑白图像:
PDF Document *pdfDocument = [[PDFDocument alloc] initWithURL:[NSURL fileURLWithPath:@"/Users/dan/Desktop/test.pdf"]];
QuartzFilter *quartzFilter = [QuartzFilter quartzFilterWithURL:[[NSBundle mainBundle] URLForResource:@"Black & White" withExtension:@"qfilter"]];
NSDictionary *options = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:quartzFilter, nil] forKeys:[NSArray arrayWithObjects:@"QuartzFilter", nil]];
[pdfDocument writeToFile:@"/Users/dan/Desktop/testResault.pdf" withOptions:options];
Run Code Online (Sandbox Code Playgroud)
不幸的是,在应用过滤器的情况下将文件写入磁盘会导致许多内存泄漏,如下所示:

这是Quartz Framework中的一个错误,还是我在上面的代码中做错了什么?
如果你想,你可以在这里下载我的测试项目:http://www.file-upload.net/download-7293644/PDF---Quartz-Memory-Leak.zip.html
我正在使用ARC.
在iOS的最新版本中,Apple已经为Objective-C实现了自动引用计数,但我不明白它的作用.
objective-c ×4
macos ×3
ios5 ×2
64-bit ×1
cocoa ×1
cocoa-touch ×1
ios ×1
ipad ×1
iphone ×1
java ×1
memory-leaks ×1
nsdata ×1
pdf ×1
python ×1