Objective C 内存管理示例

lvi*_*ani 1 memory-management objective-c

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

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

现在请考虑以下情况:

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

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

- (void) dealloc {
  [myArray release];
  [super dealloc];
}
@end
Run Code Online (Sandbox Code Playgroud)

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

// 我的其他类

MyClass *o = [[[MyClass alloc] init] autorelease];
NSMutableArray *retainedArray = [[o.myArray] retain];
Run Code Online (Sandbox Code Playgroud)

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

如果是这样,我想如果我调用以下内容,同样适用:

NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"somePath" error:nil];
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*n R 5

您所说的几乎 100% 正确,但还有一些情况您会得到 (+1) 保留的对象,您必须释放它。

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

  • 您必须最终releaseautorelease对象,你自己的
  • 您拥有使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建的对象
  • 如果您使用retain.

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