Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在从方法返回之前,是否有必要或值得将可变对象转换为不可变对象?_Ios_Objective C_Nsdictionary_Nsmutabledictionary - Fatal编程技术网

Ios 在从方法返回之前,是否有必要或值得将可变对象转换为不可变对象?

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的方法。要构建字典,您可能需要创建NSMutableDictionary。返回字典的不可变副本而不仅仅是返回可变字典有什么需要或好处吗

e、 g

还是最好执行以下操作:

- (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);