ios - 在从方法返回之前将可变 NSObject 转换为不可变 NSObject 是否有必要或值得?

标签 ios objective-c nsdictionary nsmutabledictionary

假设您有一个返回 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

同样的问题适用于 NSArrayNSString 等。我没能找到类似的问题。

有什么最佳实践/需要考虑的事情吗?

最佳答案

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/

相关文章:

android - 将 C 库连接到 iOS 应用程序

iphone - 通过点符号访问 NSDictionary?

ios - NSDictionary 中值的总和

ios - 从 SKScene 导航到 UIViewController

ios - avplayer应该在什么情况下玩?类似play()函数,设置播放速率

ios - swift 中的错误段(EXC_BAD_ACCESS)

ios - 访问 NSDictionary 时收到 SIGABRT

ios - 强制 UICollectionView 停止滚动

objective-c - 无法检测到与另一个用户一起运行的应用程序(通过切换用户)

ios - 处理 AVAsset 中的所有帧