我正在查看其他人的代码,他们会这样做。我不明白为什么他们创建了一个空数组的可变副本,然后在最后返回了一个填充数组的副本。你怎么能创建一个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];
}
答案 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;
}