iOS开发ARC、MRC不捕获异常的原因
2020-11-10 本文已影响0人
晨阳Xia
MRC手动管理引用计数时
@try {
EOCSomeClass *object = [[EOCSomeClass alloc] init];
[object doSomethingThatMayThrow];
[object release]
}
@catch(...){
NSLog(@"Whoops, there was an error. Oh well...")
}
乍一看上去似乎没有问题,但如果doSomethingThatMayThrow抛出异常了呢?由于异常会令执行过程终止并跳出catch块,因而其后的那行release代码不会运行。在这种情况下,如果代码抛出异常,那么对象就泄漏了。这么做不好。解决办法使用@finally块,无论是否抛出异常,其中的代码都会保证运行,且只运行一次。代码可更改为:
@try {
EOCSomeClass *object = [[EOCSomeClass alloc] init];
[object doSomethingThatMayThrow];
}
@catch(...){
NSLog(@"Whoops, there was an error. Oh well...")
}
@finally {
[object release]
}
注意,由于@finally块也引用object对象,所以必须把它从@try块里移到外面去。如果@try逻辑非常复杂,含有多条语句,那么很容易就会因为忘记某个对象而导致内存泄漏
在ARC环境下
@try {
EOCSomeClass *object = [[EOCSomeClass alloc] init];
[object doSomethingThatMayThrow];
}
@catch(...){
NSLog(@"Whoops, there was an error. Oh well...")
}