Ios 在从方法返回之前,是否有必要或值得将可变对象转换为不可变对象?
假设您有一个返回NSDictionary的方法。要构建字典,您可能需要创建NSMutableDictionary。返回字典的不可变副本而不仅仅是返回可变字典有什么需要或好处吗 e、 g 还是最好执行以下操作:Ios 在从方法返回之前,是否有必要或值得将可变对象转换为不可变对象?,ios,objective-c,nsdictionary,nsmutabledictionary,Ios,Objective C,Nsdictionary,Nsmutabledictionary,假设您有一个返回NSDictionary的方法。要构建字典,您可能需要创建NSMutableDictionary。返回字典的不可变副本而不仅仅是返回可变字典有什么需要或好处吗 e、 g 还是最好执行以下操作: - (NSDictionary *)doSomethingAndReturnADictionary { NSMutableDictionary * dic = [NSMutableDictionary new]; // fill in dic return [NSD
- (NSDictionary *)doSomethingAndReturnADictionary {
NSMutableDictionary * dic = [NSMutableDictionary new];
// fill in dic
return [NSDictionary dictionaryWithDictionary:dic];
}
我认为抄袭字典,特别是如果它是一本大字典,是浪费资源。我假设NSMutableDictionary
会占用更多内存,但我怀疑这两者之间是否有重大区别。该方法可以返回一个NSMutableDictionary
,但是如果在返回后不打算修改字典,为什么还要麻烦呢?返回的字典是一个NSMutableDictionary
,但编译器会将其显示为一个NSDictionary
同样的问题适用于NSArray
,NSString
等。我还没有找到类似的问题
任何最好的做法/什么都要考虑? < P>你是正确的,这通常是浪费资源而不是必要的。可变字典仍然是一个字典,任何对函数返回值感兴趣的人都知道将其视为普通字典。我们可以为此感谢遗产 苹果似乎也遵循同样的建议:
[NSThread callStackSymbols]
的返回值是一个NSArray
,但是如果您在运行时检查它,您会发现它是NSMutableArray
IMO的一个实例,如果预期不可变,那么返回不可变对象是一个很好的做法
考虑这一点:
NSString *stringExpectedToBeImmutable = [NSMutableString stringWithString:@"My immutable string."];
[((NSMutableString *) stringExpectedToBeImmutable) appendString:@" Really?"];
NSLog(@"%@", stringExpectedToBeImmutable);
<>某人可以预料到<代码> NString 传递给方法是不可变的,并基于这个假设进行计算,然后在计算字符串的中间改变。当计算开始时,字符串长度为20个字符,突然变为28个字符
这也是类型为NSString
的属性应声明为copy
的原因
这当然是一些边缘情况,但很好地说明了问题
您可以调用[dic copy]
而不是[NSDictionary Dictionary WithDictionary:dic]
。我认为copy
是获取可变对象的不可变副本的最有效方法
总结如下:
- 如果您说您正在返回immutable对象,请返回immutable
- 如果某个方法或API需要不可变的对象,则将其设置为不可变
- 使用
获取可变对象的不可变版本copy
- 我不会害怕性能开销。过早优化是邪恶的:)
NSCharacterSet
,并建议在完成修改后创建一个不可变副本。
NSString *stringExpectedToBeImmutable = [NSMutableString stringWithString:@"My immutable string."];
[((NSMutableString *) stringExpectedToBeImmutable) appendString:@" Really?"];
NSLog(@"%@", stringExpectedToBeImmutable);