今天使用 Instruments 对程序进行调试,发现了n多memory leak。原以为使用了 ARC 就不用担心内存泄漏了,发现这个东西在结合Exception使用的场景下,会有问题,编译器无法识别释放位置,导致溢出。看了官方文档没找到对这个场景介绍。偶然间发现正常逻辑和异常逻辑运行后,leak差异很大,于是就突然想到了异常的影响。
例如:
HKCTClient* client;
NSString* restaurant_pass;
NSMutableDictionary* dic;
restaurant_pass = [EncUtil encodeDESToHex:DES_KEY value:password];
client = [[HKCTClient alloc] init];
client.baseUrl = API_BASE_URL;
client.subUrl = @"restaurant/login";
client.secretKey=@"";
client.restaurantId = restaurantId;
[client addString:restaurant_pass forKey:@"restaurant_pass"];
[client doGet];
dic = [client getResult];
NSDictionary* infoDic = [dic valueForKey:@"info"];
HKCTRestaurant* o = [HKCTRestaurant buildFromJsonDic:infoDic];
if (o) {
[self setSecretKey:o.password];
}
return o;
其中红色的句子会抛出异常,但是编译器无法识别,于是ARC的方式,就无法知道该如何进行变量的release工作。因此导致client等对象在一场逻辑时无法释放。
解决方式就是不使用异常。把错误信息通过输出参数或者返回值的方式传递到调用者。