Objective C内存管理示例

时间:2013-06-05 07:59:03

标签: objective-c memory-management

我正在努力学习目标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。正确的吗?

3 个答案:

答案 0 :(得分:4)

你所说的几乎100%正确,但还有一些你得到的案例 你必须释放的(+1)保留对象。

基本规则是(见"Basic Memory Management Rules"):

  • 您最终必须releaseautorelease拥有的对象
  • 您拥有使用名称以“alloc”,“new”,“copy”或“mutableCopy”开头的方法创建的对象
  • 如果您使用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

祝你好运 伯恩哈德