gpt4 book ai didi

objective-c - @autorelease 池和循环(for、while、do)语法

转载 作者:太空狗 更新时间:2023-10-30 03:56:30 31 4
gpt4 key购买 nike

clang 允许以下循环语法:

for (...) @autorelease { ... }

while (...) @autorelease { ... }

do @autorelease { ... } while (...);

到目前为止,我还没有找到关于该语法的任何文档(Apple 没有在他们的指南中使用此语法,至少在介绍 @autorelease 构造的指南中没有),但是它是吗?合理地假设上面的三个语句等同于下面的三个语句:

for (...) { @autorelease { ... } }

while (...) { @autorelease { ... } }

do { @autorelease { ... } } while (...);

因为这就是我所期望的(按照标准 C 语法规则),但我不完全确定情况是否真的如此。它也可能是一些“特殊语法”,其中自动释放池不会为每次循环迭代更新。

最佳答案

当您考虑到任何条件语句都可以省略 { ... } block 时,第一个语法示例起作用的原因就很清楚了,从而导致仅执行以下语句。

例如:

if (something == YES)
NSLog(@"Something is yes");

相当于

if (something == YES)
{
NSLog(@"Something is yes");
}

@autoreleasepool { ... } block 只是条件语句之后的下一个语句。

我个人使用第二种语法,因为它在进行更改时不易出错,而且我发现它更易于阅读。想象一下,当您在条件和 @autoreleasepool { ... } block 之间添加语句时,结果与原始结果有很大不同。看看这个天真的例子...

int i = 1;
while (i <= 10)
@autoreleasepool
{
NSLog(@"Iteration %d", i);
++i;
}

将输出“迭代 1”到“迭代 10”。然而:

int i = 1;
int total = 0;
while (i <= 10)
total += i;
@autoreleasepool
{
NSLog(@"Iteration %d", i);
++i;
}

实际上会导致无限循环,因为永远不会到达 ++i 语句,因为它在语法上等同于:

int i = 1;
int total = 0;
while (i <= 10)
{
total += i;
}

@autoreleasepool
{
NSLog(@"Iteration %d", i);
++i;
}

关于objective-c - @autorelease 池和循环(for、while、do)语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18444432/

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