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。正确的?
您所说的几乎 100% 正确,但还有一些情况您会得到 (+1) 保留的对象,您必须释放它。
基本规则是(参见“基本内存管理规则”):
release或autorelease对象,你自己的。retain.“静态分析器”(Xcode 菜单中的“产品”->“分析”)非常擅长查找违反此规则的情况,因此我只能推荐使用它。