NSMutableArray和复制

时间:2013-12-01 03:48:23

标签: ios objective-c arrays copy

我正在查看其他人的代码,他们会这样做。我不明白为什么他们创建了一个空数组的可变副本,然后在最后返回了一个填充数组的副本。你怎么能创建一个Mutable Array并获得相同的结果呢?

+(NSArray *)allCats{
    NSMutableArray *catInfo = [@[] mutableCopy];

    NSDictionary *cat1 = @{BREED: @"Siamese Mix", COLOR: @"Grey", NAME: @"Cat1"};
    [catInfo addObject:cat1Dictionary];

    NSDictionary *cat2 = @{BREED: @"Witch Cat", COLOR: @"Black", NAME: @"Cat2"};
    [catInfo addObject:cat2Dictionary];

    NSDictionary *cat3 = @{BREED: @"Tabby", COLOR: @"Grey Striped", NAME: @"Cat3"};
    [catInfo addObject:cat3Dictionary];

    return [catInfo copy];

}

2 个答案:

答案 0 :(得分:1)

实际上,没有必要创建一个可变实例。相反,您可以简单地执行以下操作:

+ (NSArray *)allCats
{    
    return @[@{BREED:@"Siamese Mix", COLOR:@"Grey", NAME:@"Cat1"},
             @{BREED:@"Witch Cat", COLOR:@"Black", NAME:@"Cat2"},
             @{BREED:@"Tabby", COLOR:@"Grey Striped", NAME:@"Cat3"}];
}

<强>更新

为了使实现更高效,请考虑将结果数组缓存在静态变量中,如下所示:

+ (NSArray *)allCats
{    
    static NSArray *cats;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        cats = @[@{BREED:@"Siamese Mix", COLOR:@"Grey", NAME:@"Cat1"},
                 @{BREED:@"Witch Cat", COLOR:@"Black", NAME:@"Cat2"},
                 @{BREED:@"Tabby", COLOR:@"Grey Striped", NAME:@"Cat3"}];
    });

    return cats;
}

答案 1 :(得分:0)

[@[] mutableCopy]是懒惰的,但形式并不是很糟糕。我更喜欢[NSMutableArray arrayWithCapacity:][NSMutableArray array],但这并不可怕。我认为它与使用[MyObject new]而不是[[MyObject alloc] init]的顺序相同。

使用[@[] mutableCopy]表示法最糟糕的部分是它分配NSArray,然后分配NSMutableArray,然后丢弃原始NSArray。它进行2次分配和释放,其中一次分配就足够了。在一个程序的宏观方案中,可读性比一个额外的分配和释放更重要,但是纯粹主义者会将你钉在十字架上。

在您发布的代码中,最糟糕的是每次调用+allCats时,它都会重新创建所有对象的新副本。随着该列表变得更大,这将成为一个巨大的负担。我建议您查看dispatch_once并更新代码以使用它。

编辑:

您发布的更新后使用dispatch_once的代码如下所示:

+ (NSArray *)allCats
{    
    static NSArray *allCats = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSMutableArray *catInfo = [NSMutableArray array];

        NSDictionary *cat1 = @{BREED: @"Siamese Mix", COLOR: @"Grey", NAME: @"Cat1"};
        [catInfo addObject:cat1Dictionary];

        NSDictionary *cat2 = @{BREED: @"Witch Cat", COLOR: @"Black", NAME: @"Cat2"};
        [catInfo addObject:cat2Dictionary];

        NSDictionary *cat3 = @{BREED: @"Tabby", COLOR: @"Grey Striped", NAME: @"Cat3"};
        [catInfo addObject:cat3Dictionary];

        allCats = [NSArray arrayWithArray:catInfo];
    });
    return allCats;
}