Objective c 目标C-如果在return语句中调用autorelease之前发生异常,会发生什么情况?
我一直看到在从方法返回对象时调用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
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中的可恢复错误 更多信息,请看两位苹果运行时工程师: