【问题标题】:Is it expensive to alloc-init inside a for-loop in Objective C?在 Objective C 的 for 循环中分配初始化是否昂贵?
【发布时间】:2018-05-03 08:49:12
【问题描述】:

只是一个关于一般编程的问题。

我可以选择任何一个选项:

for(some_conditions)
{
 NSFileManager * fm = [[NSFileManager alloc] init];
 BOOL result = [fm moveItemAtPath:x toPath:y error:&err];
}

或者我可以去:

NSFileManager * fm = [[NSFileManager alloc] init];
for(some_conditions)
{
 BOOL result = [fm moveItemAtPath:x toPath:y error:&err];
}

我想知道的是,在执行这两个选项所花费的时间和空间方面,两者之间是否存在计算差异? 提前感谢一堆:)

【问题讨论】:

  • 因为您正在访问文件系统,所以与文件管理器重复分配/释放相关的少量额外时间将无关紧要。

标签: objective-c for-loop initialization


【解决方案1】:

如果您不打算使用 NSFileManagerDelegate,请考虑使用defaultManager

NSFileManager *fm = NSFileManager.defaultManager;

它不仅被初始化一次,而且你可以想象它可能会保留一些内部内存缓存来加速某些操作。

如果对性能感兴趣,您应该在代码中添加(并打印)计时,并使用真实数据进行尝试。我的猜测是,与moveItemAtPath 相比,alloc/init 的时间可以忽略不计。

可以在 Xcode 分配工具或调试内存图中检查空间分配。我的猜测是两者都是一样的,因为在第一个变体中,fm 在每次循环迭代结束时被销毁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2015-09-29
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多