gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:01 27 4
gpt4 key购买 nike

我经常使用简单的非编译时不可变对象(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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com