Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c @自动释放池语义_Objective C_Llvm_Automatic Ref Counting - Fatal编程技术网

Objective c @自动释放池语义

Objective c @自动释放池语义,objective-c,llvm,automatic-ref-counting,Objective C,Llvm,Automatic Ref Counting,我正在llvm网站上阅读ARC文档: …特别是关于@autoreleasepool 在当前许多使用NSAutoreleasePool的实现中,我看到在循环迭代期间池被周期性地耗尽的情况-我们如何使用@autorelease pool来做同样的事情,或者是在某种程度上为我们做的 其次,文档声明,如果抛出异常,池不会被耗尽。。。。ok异常是按名称命名的异常,但如果它们确实发生,您可能希望在不泄漏内存负载的情况下进行恢复。文档没有指定这些对象的发布时间 有人知道这些点的信息吗 我们如何使用@autor

我正在llvm网站上阅读ARC文档:

…特别是关于@autoreleasepool

在当前许多使用NSAutoreleasePool的实现中,我看到在循环迭代期间池被周期性地耗尽的情况-我们如何使用@autorelease pool来做同样的事情,或者是在某种程度上为我们做的

其次,文档声明,如果抛出异常,池不会被耗尽。。。。ok异常是按名称命名的异常,但如果它们确实发生,您可能希望在不泄漏内存负载的情况下进行恢复。文档没有指定这些对象的发布时间

有人知道这些点的信息吗

我们如何使用@autorelease pool进行同样的操作

像这样:

for (int i = 0; i < 10000; i++) {
    @autoreleasepool {
        // Do your work here
        ...
    }
}
for(int i=0;i<10000;i++){
@自动释放池{
//你在这里工作吗
...
}
}
其次,文档声明,如果抛出异常,池不会被耗尽。。。。ok异常是按名称命名的异常,但如果它们确实发生,您可能希望在不泄漏内存负载的情况下进行恢复

AFAIK这在ARC中是不可能的。ARC一点也不例外安全。如果发生异常,则可能存在不可恢复的内存泄漏。使用ARC的代码不应依赖异常进行错误报告。我们期望在引发异常时,进程无论如何都会崩溃

在当前许多使用NSAutoreleasePool的实现中,我看到在循环迭代期间池被周期性地耗尽的情况-我们如何使用@autorelease pool来做同样的事情,或者是在某种程度上为我们做的

以同样的方式,即通过级联自动释放池。例如:

@autoreleasepool {
    …
    for (int i = 0; i < MAX; i++) {
        @autoreleasepool {
            …
        }
    }
    …
}
@autoreleasepool{
…
对于(int i=0;i
其次,文档声明,如果抛出异常,池不会被耗尽。。。。ok异常是按名称命名的异常,但如果它们确实发生,您可能希望在不泄漏内存负载的情况下进行恢复。文档没有指定这些对象的发布时间


在大多数情况下,由于Cocoa中异常的特殊性质,程序无法正常恢复,因此我认为泄漏对象的问题较小。如果由于异常而退出
@autoreleasepool
块,则只有在弹出其中一个封闭的autorelease池时,才会释放相应的autorelease对象。当然,您可以将
@try/@catch/@finally
块放在
@autoreleasepool
块中以防止这种情况发生。

我认为您答案的第二部分不太正确。自动释放池本身在分配时生效的自动释放池中自动释放。只要异常不传播到最外层的自动释放池之外,自动释放的对象就不会泄漏。@bavariable-谢谢您的回答。可以肯定的是,在使用
stringWithFormat
时,它会在循环中泄漏内存。