从具有NSArray返回值的方法返回NSMutableArray对象

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)

在返回值时,我可以想到四种可能的方法:

  1. NSMutableArray直接退货(如上)

    return returnValue;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 回来一个 copy

    return [returnValue copy];
    
    Run Code Online (Sandbox Code Playgroud)
  3. 返回使用NSArray arrayWithArray:

    return [NSArray arrayWithArray:returnValue];
    
    Run Code Online (Sandbox Code Playgroud)
  4. 创建一个NSArray,手动设置NSMutableArraynil:

    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下相同).如果returnValuenil,则选项2将返回nil,但选项3和4将返回空NSArray.(这两种行为都是可取的;你应该决定你希望这种方法的行为方式).此外,-copy可能比一个更快的操作+arrayWithArray.

我会选择2.