假设您有一个返回 NSDictionary 的方法。要构建字典,您可能需要创建一个 NSMutableDictionary。返回字典的不可变副本而不是仅返回可变字典是否有任何必要或优势?
例如
- (NSDictionary *)doSomethingAndReturnADictionary {
NSMutableDictionary * dic = [NSMutableDictionary new];
// fill in dic
return dic;
}
还是执行以下操作更好:
- (NSDictionary *)doSomethingAndReturnADictionary {
NSMutableDictionary * dic = [NSMutableDictionary new];
// fill in dic
return [NSDictionary dictionaryWithDictionary:dic];
}
我认为复制字典,尤其是大字典,是一种资源浪费。我假设 NSMutableDictionary
占用更多内存,但我怀疑两者之间存在重大差异。该方法可以返回一个 NSMutableDictionary
,但如果字典不打算在返回后进行修改,何必呢?返回的字典是 NSMutableDictionary
,但编译器会将其显示为 NSDictionary
。
同样的问题适用于 NSArray
、NSString
等。我没能找到类似的问题。
有什么最佳实践/需要考虑的事情吗?
最佳答案
IMO,如果期望不可变,这是返回不可变对象(immutable对象)的好习惯。
考虑一下:
NSString *stringExpectedToBeImmutable = [NSMutableString stringWithString:@"My immutable string."];
[((NSMutableString *) stringExpectedToBeImmutable) appendString:@" Really?"];
NSLog(@"%@", stringExpectedToBeImmutable);
有人可能期望传递给方法的 NSString
是不可变的,并基于此假设进行一些计算,然后在计算过程中字符串会发生变化。计算开始时,字符串长度为 20 个字符,突然变成 28 个字符。
这也是为什么像 NSString
这样的类型的属性应该被声明为 copy
的原因。
这当然是一些边缘案例,但很好地说明了问题。
您可以调用[dic copy]
,而不是[NSDictionary dictionaryWithDictionary:dic]
。我认为 copy
是获取可变对象的不可变副本的最有效方法。
总结:
- 如果你说你要返回不可变对象(immutable对象),就返回不可变对象(immutable对象)
- 如果某些方法或 API 需要不可变对象(immutable对象),则给它们不可变
- 使用
copy
获取可变对象的不可变版本 - 我不担心性能开销。过早的优化是邪恶的:)
关于ios - 在从方法返回之前将可变 NSObject 转换为不可变 NSObject 是否有必要或值得?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33222982/