今天使用 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等对象在一场逻辑时无法释放。
解决方式就是不使用异常。把错误信息通过输出参数或者返回值的方式传递到调用者。
相关推荐
NSException NSFileManager NSObject NSSet NSString NSTimer NSURL UIKit UIBezierPath UIButton UIColor UIDevice UIImage UIImageView UILable UINavigationController UIResponder UIScrollView UISearchBar ...
主要用于NSException 异常的捕捉,可以捕获对应的异常。
ios录音的caf文件转MP3文件,以兼容android 注意音频参数的设置,如果声音异常,请调整参数。 code: AVAudioSession *session = [AVAudioSession sharedInstance]; NSError *sessionError; [session ...
在僵尸或内存损坏的情况下恢复丢失的NSException消息。 内省寄存器和堆栈中的对象(C字符串和Objective-C对象,包括ivars)。 提取有关异常引用的对象的信息(例如“发送到实例0xa26d9a0的无法识别的选择
鲶鱼它是一个开源项目,包含一组用于 iOS 平台的库,用 Objective-C 编写。 它的目标是帮助程序员拥有大多数项目中日常所... 如果您在项目中使用 Catfish,归因会很好。吉祥物执照版权所有 :copyright: 2013 Jairo Bar
一个很小的库,可让您直接在Swift代码中捕获Objective-C NSException。 一体化 可可豆 您可以使用安装NSExceptionSwift将其添加到您的Podfile : platform :ios , '8.0' use_frameworks! target 'MyApp' do pod '...
主要分为以下两种场景: NSException异常Unix信号异常捕获NSException异常通过NSSetUncaughtExceptionHandler函数来设置异常处理函数,然后收集异常变量信息捕获信号Mach异常和Unix信号在iOS系统中,每个踩,任务,...