我正在努力学习目标c,我仍然对内存管理感到困惑。 是的我知道,我应该使用ARC,但我的项目使用不支持它的TouchXML。 还有很多关于内存管理的文档和线程,我已经阅读过,但我仍有一些疑问,我希望你们能帮助我澄清。
我已经知道谁分配一个对象然后负责释放它。我还了解到“retain”会增加引用计数器,而“release”会减少它。当对象的引用计数器达到0时,它将自动解除分配。 我终于知道“autorelease”会在当前事件周期结束时自动释放对象。没关系。
现在请考虑以下情况:
我分配了一个我需要用于对象的整个生命周期的数组。当我的对象被删除时,我有责任释放它:
@implementation MyClass
-(id) init {
myArray = [[NSMutableArray alloc] init]; // this is a @property
}
- (void) dealloc {
[myArray release];
[super dealloc];
}
@end
这样,在dealloc方法中,myArray释放也会导致myArray被释放。 如果我然后从myClass中实例化一个新对象并像这样保留myArray ......
// MyOtherClass
MyClass *o = [[[MyClass alloc] init] autorelease];
NSMutableArray *retainedArray = [[o.myArray] retain];
...在当前事件周期结束时,“o”将自动解除分配,而retainArray(实际上指向o.myArray)将不会被释放,直到我调用[retainedArray release]。 这是正确的吗?
如果是这样的话,我也会猜测如果我打电话的话也是如此:
NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"somePath" error:nil];
我不需要(实际上我不能给出运行时错误)为“内容”调用release或autorelease,除非我在代码中保留它。正确的吗?
如果是这样,总结一切,最后我只需要调用释放,如果我调用alloc或retain。我班级中引用计数的余额应始终为0,其中alloc / retains给出+1,release给出-1。正确的吗?
答案 0 :(得分:4)
你所说的几乎100%正确,但还有一些你得到的案例 你必须释放的(+1)保留对象。
基本规则是(见"Basic Memory Management Rules"):
release
或autorelease
您拥有的对象。retain
获取所有权,则拥有对象。“静态分析器”(产品 - &X; Xcode菜单中的分析)非常擅长查找 违反此规则,所以我只能建议使用它。
答案 1 :(得分:2)
您可以使用Touch XML和ARC。我也在我的项目中使用TouchXML。只需转到项目构建阶段,双击每个Touch XML.m文件,然后输入-fno-objc-arc。这将禁用该文件的ARC。
如果您对内存管理有很多了解或者想了解有关内存管理的更多信息,请使用MRC,但如果您想避免麻烦,请使用ARC。
答案 2 :(得分:1)
没有直接回答您的问题,但您也可以在ARC项目中使用非ARC代码:
http://www.codeography.com/2011/10/10/making-arc-and-non-arc-play-nice.html
祝你好运 伯恩哈德