1

我正在尝试学习目标 c,但我仍然对内存管理有些困惑。是的,我知道,我应该使用 ARC,但我的项目使用不支持它的 TouchXML。还有很多我读过的关于内存管理的文档和线程,但我仍然有一些疑问,希望你们能帮助我澄清。

我了解到谁分配了一个对象然后负责释放它。我还了解到“保留”会增加引用计数器,而“释放”会减少它。当一个对象的引用计数器达到 0 时,它会被自动解除分配。我终于了解到“自动释放”会在当前事件周期结束时自动释放对象。没关系。

现在请考虑以下情况:

我分配了一个数组,我需要在对象的整个生命周期中使用它。我有责任在我的对象被删除时释放它:

@implementation MyClass
-(id) init {
  myArray = [[NSMutableArray alloc] init]; // this is a @property
}

- (void) dealloc {
  [myArray release];
  [super dealloc];
}
@end

这样,在dealloc方法中,myArray释放也会导致myArray o被释放。如果然后我从 myClass 实例化一个新对象并像这样保留 myArray ...

// 我的其他类

MyClass *o = [[[MyClass alloc] init] autorelease];
NSMutableArray *retainedArray = [[o.myArray] retain];

...在当前事件周期结束时,“o”将被自动释放,而在我调用 [retainedArray release] 之​​前,retainedArray(实际上指向 o.myArray)不会被释放。这是正确的吗?

如果是这样,我也猜想如果我调用类似的东西同样适用:

NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"somePath" error:nil];

我不需要(实际上我不能,否则它会给出运行时错误)为“内容”调用释放或自动释放,除非我将它保留在我的代码中的某个位置。正确的?

如果是这样,总结一切,最后我只需要调用释放,如果我调用分配或保留。我的类中引用计数的平衡应始终为 0,其中 alloc / retains 给出 +1,而 release 给出 -1。正确的?

4

3 回答 3

5

您所说的几乎 100% 正确,但是在其他一些情况下,您必须释放 (+1) 保留对象。

基本规则是(参见“基本内存管理规则”):

  • 你必须最终release还是你拥有的autorelease对象。
  • 您拥有使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建的对象</li>
  • 如果您使用 获得所有权,则您拥有一个对象retain

“静态分析器”(Xcode 菜单中的产品 -> 分析)非常擅长发现违反此规则的情况,所以我只能推荐使用它。

于 2013-06-05T08:16:07.737 回答
2

您可以将 Touch XML 与 ARC 一起使用。我也在我的项目中使用 TouchXML。只需进入项目构建阶段,双击每个 Touch XML.m 文件,然后输入 -fno-objc-arc。这将禁用该文件的 ARC。

如果你对内存管理有很多了解或者真的想了解更多关于内存管理的知识,那就使用 MRC,但如果你想避免麻烦,使用 ARC。

于 2013-06-05T08:06:18.863 回答
1

没有直接回答您的问题,但您也可以在 ARC 项目中使用非 ARC 代码:

http://www.codeography.com/2011/10/10/making-arc-and-non-arc-play-nice.html

最好的问候伯恩哈德

于 2013-06-05T08:05:44.447 回答