gpt4 book ai didi

iphone - 使用 Xcode 处理循环中对象的正确方法

转载 作者:行者123 更新时间:2023-12-03 16:55:02 25 4
gpt4 key购买 nike

我想知道您能否让我了解以下两个几乎相似但对象较小和较大的场景。

场景 1:

在下面的代码中:

NSString *iAmAstring;
for(int i = 0; i < 100000;i++)
{
NSLog(@"INT VALUE: %d", i);
iAmAstring = [NSString stringWithFormat:@"%d", i];
NSLog(@"STRING VALUE: %@", iAmAstring);
}

有人告诉我,自从我打开 ARC 以来,执行上述大规模循环并没有任何影响,并且在每个循环运行中,我都会分配并初始化一个字符串指针。因为有人告诉我它太小了,没关系,而且 ARC 可以处理它。但不适用于更大的物体。我最初来自 C# 背景,我习惯于将循环结束时的字符串设置为 null,但在这里你不能在循环结束时释放它,因为 ARC 会提示,并且有人告诉我如果我将其设置为 nil 在循环结束时,我将为 ARC 创建更多工作,但我并没有真正正确地做事,而是创建了僵尸代码。有人可以澄清他们会对他们分配的对象做什么,在一个内存大小很小的大循环中初始化(最好是我使用的字符串),并在循环结束时打开 ARC?

场景 2:

与上面相同,但假设现在上面使用的 NSSTRING 现在是另一个尺寸很大的对象。在这里,我显然会在循环之前分配和初始化它,然后通过设置它在循环中使用它,但是我将如何在循环结束时再次对它做一些事情以释放它,所以再次打开 ARC?

提前致谢。

最佳答案

在 ARC 下,您可以使用 @autoreleasepool {} block 定义自动释放池。这些 block 创建新的自动释放对象池,并在 block 的范围结束时耗尽它们。

NSString *iAmAstring;
for(int i = 0; i < 100000;i++)
{
@autoreleasepool {
NSLog(@"INT VALUE: %d", i);
iAmAstring = [NSString stringWithFormat:@"%d", i];
NSLog(@"STRING VALUE: %@", iAmAstring);
}
}

这将耗尽自动释放池并在循环的每次迭代中释放所有自动释放的对象。对于小字符串来说这是一种浪费,但对于较大的对象可能会有很大帮助。

关于自动释放如何工作的快速说明:它所做的只是在池耗尽时为您的对象提供一次对 release 的额外调用。默认池在事件循环中被耗尽(即在方法退出后的某个时间)。当 @autoreleasepool 的范围结束时,您手动创建的池将被耗尽。

I am originally from C# background and I am used to setting even my string at the end of loop to null

除非您稍后重新使用该变量,否则这会向您的程序添加完全无用的代码行:C# 编译器已经足够聪明了一段时间,可以找出使您的对象可用于垃圾回收的最早点,因此分配给 null 没有帮助。

关于iphone - 使用 Xcode 处理循环中对象的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11642898/

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