大家发现了没有:在java代码中经常看到异常捕获,来避免应用异常并且定位问题,给出错误提示,而在苹果开发中基本很少见到@try{}@catch (NSException *exception) {}。
苹果代码若是捕获到异常也处于癌症晚期了,它仍旧会崩溃的。甚至你不加@try{}@catch (NSException *exception) {}时,它好好的加了,它就crash了。它真是一鸡肋功能啊!一定要慎加。
但是它真的那么无用,也不竟然。我在做曹操司机端时,就遇到一个司机找到我们,说他的手机,装上曹操司机端应用起不来。我测试自己的手机没有问题啊!我定位很可能和手机有关。就让他找到我,把他的手机连接XCODE,在线调试,发现应用启动时死在这一句代码上:
[_locationManager requestAlwaysAuthorization];
他的手机时iPhone 4s,操作系统是8.0。
后来赶紧定位,以前在iOS7上我也遇到过调用这段代码崩溃过:
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"请在设置中授权曹操专车使用GPS定位服务!" message:nil delegate:self cancelButtonTitle:@"设置" otherButtonTitles:nil, nil]; alertView.tag =111; // @try // { [alertView show]; // } // @catch (NSException *exception) { // }
我立即给它加上这个异常捕获,结果再运行,ok了。可以看到它也不全是废物。
//如果没有授权则请求用户授权
AppDelegate.m文件:
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) { @try { if (IOS_VERSION_LARGE_OR_EQUAL(8.0)) { [_locationManager requestAlwaysAuthorization]; } } @catch (NSException *exception) { } }
可见对弹出框加上异常有备无患。
而对文件操作,按照我以前写Vc的常用写法,对读取文件进行异常捕获,结果给它一个非法文件路径,它直接crash了,把异常捕获去掉,它虽然读到的是个nil,但是不至于崩溃啊!所以要慎加异常捕获,不能一概而论,画蛇添足的事情还是不要做的为好!
+ (BOOL)storageImageWithFilePath:(NSString *)filePath image:(UIImage *)image { if(!filePath || ![filePath isKindOfClass:[NSString class]]) { return NO; } if(!image || ![image isKindOfClass:[UIImage class]]) { return NO; } // NSFileManager* fm = [NSFileManager defaultManager]; // if([fm fileExistsAtPath:filePath]) { @try { NSData *imageData = UIImagePNGRepresentation(image); [imageData writeToFile:filePath atomically:YES]; return YES; } @catch (NSException *exception) { NSLog(@"ImageCache save image error:%@", exception); return NO; } @finally { } } }