gpt4 book ai didi

objective-c - Objective-C 中的 For 循环优化

转载 作者:搜寻专家 更新时间:2023-10-30 20:05:23 24 4
gpt4 key购买 nike

只是寻找一些关于如何最好地优化 Obj-C 和 ARC 中的 for 循环(在内存使用方面)的简单建议,将这个未优化的任意代码作为:

NSMutableArray *array = [NSMutableArray array];

for (NSDictionary *dict in NSArray *arrayOfDicts) {

NSString *first = [dict valueForKeyPath:@"object.first"];
NSString *second = [dict valueForKeyPath:@"object.second"];
NSString *third = [dict valueForKeyPath:@"object.third"];

[array addObject:@[first, second, third]];

}

哪一个在实践中更好/正确(假设有很多循环,所以这可能很重要)

1) 声明一次,复制到数组中。

NSMutableArray *array = [NSMutableArray array];
NSString *first, *second, *third;

for (NSDictionary *dict in NSArray *arrayOfDicts) {

first = [dict valueForKeyPath:@"object.first"];
second = [dict valueForKeyPath:@"object.second"];
third = [dict valueForKeyPath:@"object.third"];

[array addObject:@[[first copy], [second copy], [third copy]]];
first, second, third = nil;

}

2) 自动释放池

NSMutableArray *array = [NSMutableArray array];

for (NSDictionary *dict in NSArray *arrayOfDicts) {

@autoreleasepool {
NSString *first = [dict valueForKeyPath:@"object.first"];
NSString *second = [dict valueForKeyPath:@"object.second"];
NSString *third = [dict valueForKeyPath:@"object.third"];

[array addObject:@[first, second, third]];
}

}

3) 还有别的吗?

最佳答案

firstsecondthird 在所有情况下都可以在循环之外存活,因为它们在 dict 中. @[first, second, third] 的数组仍然存在,因为它已被添加到数组中。

因此,三者之间的差异非常有限。 valueForKeyPath: 不会生成副本,因此您所谈论的只是 (i) 保留计数表中的存储*; (ii) 存储在自动释放池中。

(i) 不仅可以忽略不计,而且在运行时的当前实现中如此内部,以至于没有必要依赖它。 (ii) 也可以忽略不计,但规范明确要求。

从技术上讲,@autoreleasepool 可能会稍微紧凑一些(取决于空池的总大小与将对象添加到池所需的大小以及数组的长度)但我不会迷恋它。

前两个选项之间绝对没有区别。存储的本地化程度不会影响 ARC — 即使不依赖确切的 ARC 实现细节,您也会在下一次迭代的顶部重新分配,无论如何。

(* 在它们大于 1 之前不会存储保留计数,因为 1 是一个非常常见的值,并且完全存在于一个对象中;因此它们放在一个单独的表中,而不是与对象一起)

2018 年编辑:64 位运行时实际上在 isa 指针的一部分中存储了大于 1 但小于很大数字的保留计数,因为目前不需要整个 64 位范围。如果有的话,他们可以再次将保留计数移出。在原始的 64 位运行时中,这个非常大的数字是 2^19+1,但它的大小不透明,因此此后可能发生了变化。因此,额外的保留基本上不会增加​​现代设备上的内存占用。

关于objective-c - Objective-C 中的 For 循环优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25149811/

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