val*_*rij 11 objective-c automatic-ref-counting
从使用a动态构建数组的方法返回NSArray
(或NSDictionary
等)NSMutableArray
时,使用ARC时执行此操作并避免随机内存泄漏的标准方法是什么?
例如,假设我们有一些带有名称列表的类,我们想手动过滤并获取以给定字母开头的所有名称:
- (NSArray *)getNamesByFirstLetter:(NSString *)firstLetter
{
NSMutableArray *returnValue = [[NSMutableArray alloc] init];
for(id item in self.names)
{
if([item hasPrefix:firstLetter])
{
[returnValue addObject:item];
}
}
return returnValue; // just return the above array
}
Run Code Online (Sandbox Code Playgroud)
在返回值时,我可以想到四种可能的方法:
NSMutableArray
直接退货(如上)
return returnValue;
Run Code Online (Sandbox Code Playgroud)回来一个 copy
return [returnValue copy];
Run Code Online (Sandbox Code Playgroud)返回使用NSArray arrayWithArray
:
return [NSArray arrayWithArray:returnValue];
Run Code Online (Sandbox Code Playgroud)创建一个NSArray
,手动设置NSMutableArray
为nil
:
NSArray *temp = [NSArray arrayWithArray:returnValue]; // could use [returnValue copy] here too
returnValue = nil;
return temp;
Run Code Online (Sandbox Code Playgroud)当一个程序使用ARC时,这四种方法之间是否有任何真正的区别,或者只是归结为个人偏好?
此外,除了可能的内存泄漏,使用一种方法而不是另一种方法时还有其他含义吗?
请注意,如果这是重复的,请告诉我,我会将问题记下来.我尝试过搜索,但很难将问题缩小到几个搜索条件.
小智 9
启用ARC后,所有四个选项都可以正常使用(即,您提出的解决方案都不会导致内存泄漏).
但是,您概述的4种解决方案略有不同.数字1将返回一个NSMutableArray
,这可能不会导致问题,因为NSMutableArray
将响应所有相同的消息NSArray
(但返回的对象将是可变的,您可能不需要).
选项2和选项3和4之间存在细微差别(在ARC下相同).如果returnValue
是nil
,则选项2将返回nil
,但选项3和4将返回空NSArray
.(这两种行为都是可取的;你应该决定你希望这种方法的行为方式).此外,-copy
可能比一个更快的操作+arrayWithArray
.
我会选择2.
归档时间: |
|
查看次数: |
3524 次 |
最近记录: |