Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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 目标C-如果在return语句中调用autorelease之前发生异常,会发生什么情况?_Objective C_Memory Management - Fatal编程技术网

Objective c 目标C-如果在return语句中调用autorelease之前发生异常,会发生什么情况?

Objective c 目标C-如果在return语句中调用autorelease之前发生异常,会发生什么情况?,objective-c,memory-management,Objective C,Memory Management,我一直看到在从方法返回对象时调用autorelease的例子,但如果在分配内存和返回对象之间发生异常,这是否有内存泄漏的风险 NSString *newString = [[NSString alloc] init]; //Do some other stuff which causes exception return [newString autorelease]; 为了让我的意思更清楚一点: @autoreleasepool { try { Som

我一直看到在从方法返回对象时调用autorelease的例子,但如果在分配内存和返回对象之间发生异常,这是否有内存泄漏的风险

    NSString *newString = [[NSString alloc] init];
    //Do some other stuff which causes exception
    return [newString autorelease];
为了让我的意思更清楚一点:

@autoreleasepool {
    try {
    SomeObject *newObject = [SomeClass generateAutoreleaseObject];
    } @catch (NSException *e) {
        //log exception and carry on.
    }
}
如果GenerateAuthoreLeaseObject如下所示,是否存在内存泄漏

    (SomeObject*)generateAutoreleaseObject {
        SomeObject *newObject = [[SomeObject alloc] init];
        //Do some other stuff which causes exception
        return [newObject autorelease];
    }

如果返回自动保存对象的基础类处理这个,我可以在我的床上轻松入睡,在安全的知识中,StrugWordFoundTURL将不会留下任何内存浮动,因为它有一个问题从URL读取? 但是,如果在分配内存和返回对象之间发生异常,这不是有内存泄漏的风险吗

    NSString *newString = [[NSString alloc] init];
    //Do some other stuff which causes exception
    return [newString autorelease];
是的。异常将执行直接从引发点移动到处理程序。这在以下章节中明确指出:

这里的问题很明显:如果
doSomethingElse:
方法引发异常,则内存泄漏

那么,你怎样才能摆脱这一困境呢?那么,异常处理语法包括一个
@finally
块,它在
@try
和执行任何
@catch
之后运行

如果在
-generateAutoreleaseObject
中可能出现异常,则可以使用带有
@finally
块的本地异常处理程序来确保资源已清理,如果需要,还可以重新引发异常。但请参见下面关于内部Cocoa代码的内容

如果GenerateAuthoreLeaseObject如下所示,是否存在内存泄漏

    (SomeObject*)generateAutoreleaseObject {
        SomeObject *newObject = [[SomeObject alloc] init];
        //Do some other stuff which causes exception
        return [newObject autorelease];
    }
对。同样值得一提的是,ARC在这方面未必有帮助。同样,控制从投掷点跳到操控点。默认情况下,弧处于该状态。(不过,您可以在该链接上看到,您可以使用一个编译器选项。)

如果返回AutoRelayObjation对象的基础类处理这个

不是真的。如果异常跳回到涉及框架内部的堆栈框架上,则不能保证框架内部的状态。这是很难避免的,这就是为什么人们认为例外不适用于Cocoa中的可恢复错误

更多信息,请看两位苹果运行时工程师: