我经常使用简单的非编译时不可变对象(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。然后我考虑使用 static
和 dispatch_once
是否有明显的好处。如果没有值得使用 static
的理由,我将其保留为局部变量。
如果重新分配的开销(速度)太大(但如果永久内存命中太大则不使用),则使用static
。
关于objective-c - 何时使用 dispatch_once 与重新分配? ( cocoa / cocoa touch ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36219361/