我正在尝试学习目标 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。正确的?