objective-c - 何时使用 dispatch_once 与重新分配? ( cocoa / cocoa touch )

标签 objective-c cocoa cocoa-touch

我经常使用简单的非编译时不可变对象(immutable对象):比如数组 @[@"a", @"b"] 或字典 @{@"a": @ “b”

我一直在重新分配它们之间挣扎:

- (void)doSomeStuff {
    NSArray<NSString *> *fileTypes = @[@"h", @"m"];
    // use fileTypes
}

并分配一次:

- (void)doSomeStuff {
    static NSArray<NSString *> * fileTypes;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        fileTypes = @[@"h", @"m"];
    });
    // use fileTypes
}

是否有关于何时使用每种结构的建议?喜欢:

  • 取决于分配对象的大小
  • 取决于分配的频率
  • 取决于设备(iPhone 4 与 iMac 2016)
  • ...

我该如何解决?

最佳答案

您的项目符号列表是一个好的开始。内存将是另一个考虑因素。 static 变量从实际初始化开始一直保留在内存中,直到应用程序终止。显然,局部变量将在方法结束时被释放(假设没有进一步的引用)。

可读性也是需要考虑的因素。重新分配行比 dispatch_once 设置更容易阅读。

对于一个小数组,我会将重新分配作为首选。开销很小。除非您在紧密循环中创建数组,否则性能可以忽略不计。

我会使用 dispatch_once 和一个 static 变量来处理需要更多开销的事情,例如创建日期格式化程序。但随之而来的是对用户更改设备区域设置使用react的开销。

最后我的思路是先用reallocation。然后我考虑使用 staticdispatch_once 是否有明显的好处。如果没有值得使用 static 的理由,我将其保留为局部变量。

如果重新分配的开销(速度)太大(但如果永久内存命中太大则不使用),则使用static

关于objective-c - 何时使用 dispatch_once 与重新分配? ( cocoa / cocoa touch ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36219361/

相关文章:

objective-c - 如何使用 RegexKitLite 转义 NSString 中的特殊字符?

iphone - UIButton 导致崩溃

objective-c - 在 Xcode 中使用 Cocoa Framework 显示窗口

iphone - 在 iPhone 中访问语音邮件

iphone - 多条彩色贝塞尔路径

ios - 如何使用 UIScrollview contentoffset iOS 保持 UIView 居中?

objective-c - 64 位模式下偶发 EXC_BAD_INSTRUCTION (SIGILL)

ios - Swift NSCoding 中的 EXC_BAD_INSTRUCTION

objective-c - 遍历对象的 NSMutableArray

ios - AVSpeechSynthesizer 有问题,有解决方法吗?