Objective-C手动内存管理环境下,是否需释放其他函数返回的数组?
Objective-C手动内存管理:是否需要释放childNodes变量
结论:你不需要手动对childNodes执行release或autorelease操作,你的判断是正确的。
原因分析(基于MRC内存管理规则)
在手动内存管理中,只有当你通过alloc/new/copy/mutableCopy创建对象,或者主动调用retain持有对象时,才需要负责调用release或autorelease来释放对象。
看你提供的flattenedNodeArray方法实现:
- (NSMutableArray *) flattenedNodeArray:(NSMutableArray*) array { NSMutableArray *_flatTodoList = [[[NSMutableArray alloc] init] autorelease]; for (TreeNode *element in array) { [_flatTodoList addObject:element]; if ([element children] != nil) { NSMutableArray *array1 = [self flattenedNodeArray:[element children]]; for (TreeNode *element in array1) { [_flatTodoList addObject:element]; } } } return _flatTodoList; }
这里创建数组时,[[NSMutableArray alloc] init]会让方法持有这个数组,但紧接着调用了autorelease,将数组加入自动释放池——这意味着该数组会在自动释放池清空时自动释放,方法返回的是一个自动释放状态的对象。
而getFlattenedChildren只是直接返回这个自动释放的数组,所以当你在setNodeAndChildrenCompletion::中获取childNodes时,你并没有持有这个对象(既没有调用retain,也不是通过alloc等方法创建的),因此不需要负责释放它。
补充验证
再看你的调用代码:
- (void) setNodeAndChildrenCompletion: (TreeNode *) node :(bool) isComplete { node.isCompleted = isComplete; NSMutableArray *childNodes = [self getFlattenedChildren:node]; for (TreeNode *node in childNodes) { node.isCompleted = isComplete; } }
整个过程中你没有对childNodes执行任何持有操作,完全符合MRC的内存管理规范,无需额外释放。
内容的提问来源于stack exchange,提问作者mars_dev
相关产品推荐
相关产品推荐

