程序崩溃---autorelease异常
来源:互联网 发布:淘宝卖家流量中心 编辑:程序博客网 时间:2024/06/07 00:54
1. 在自己实现 便利构造器 时导致每次执行程序都产生空指针异常。代码和原因如下:
+ (UILabel*)labelWithFrame:(CGRect)frame andText:(NSString*)text{ UILabel *label = [[UILabel alloc] initWithFrame:frame]; label.text = text; return [label autorelease];}
@implementation AAAController- (void)init{ _label = [UILabel labelWithFrame:CGRectMake(30, 100, 100, 30) andText:@“姓名”]; [self.view addSubview:_label];}- (void)dealloc{ [_label release]; _label = nil; [super dealloc];}@end
想实现一个UILabel的便利构造器,但是每次执行页面切换后都产生空指针异常。
找了很久才找到了原因:
构造器返回的是一个autorelease对象,而当执行了_label = [UILabel labelWithFrame:CGRectMake(30, 100, 100, 30) andText:@“姓名”];之后,_label指向的就是那个autorelease对象,而引用计数却没有加1(此时为1)。此时是危险的,当autorelease对象释放后,_label也就销毁了。而如果autorelease对象前期没有销毁,而是到对象调用了dealloc方法,在方法中执行了[_label release]后,也就相应的将autorelease对象销毁了。之后当autorelease对象想自动销毁时,就导致了程序的崩溃,而且控制台中也不会指出是什么错误。出现这种错误的原因是没有正确的理解便利构造器的使用导致的,所以要好好理解,不能滥用。
以下是改进方法 :
既然知道了导致崩溃的原因(多用了一次release),那就好办了。如下:
方法一: 修改dealloc。即将[_label release]; _label = nil; 删除。
方法二: 将_label = [UILabel labelWithFrame:CGRectMake(30, 100, 100, 30) andText:@“姓名”]; 修改为: self.label = [UILabel labelWithFrame:CGRectMake(30, 100, 100, 30) andText:@“姓名”]; (因为在调用setter方法时引用计数加了1),之后调用了dealloc将 _label release 后,就不会将autorelease对象销毁了。(这种方法更符合编程习惯)。
方法三:把便利构造器修改为:
return [[label retain] autorelease];
0 0
- 程序崩溃---autorelease异常
- 捕获程序崩溃异常
- Android:处理程序崩溃异常
- Android:处理程序崩溃异常
- Android程序异常崩溃处理
- windows程序崩溃对话框和异常处理
- android处理crash程序崩溃异常
- Android 对程序异常崩溃的捕捉
- Android程序崩溃异常收集框架
- Android程序崩溃异常处理框架
- Android程序崩溃异常收集框架
- Android 对程序异常崩溃的捕捉
- Android 对程序异常崩溃的捕捉
- 捕获程序崩溃异常上传到服务器
- android处理crash程序崩溃异常
- windows 程序异常崩溃等错误定位
- 捕获android程序崩溃异常日志
- Android 对程序异常崩溃的捕捉
- 纪念逝去的昨天(1)
- Java学习笔记之Java基础
- html中input文本框,初始里边有文字提示,当点击时,文字消失
- 公司笔试题——统计10进制数中的二进制值有多少个1
- Vistual studio 快捷键积累
- 程序崩溃---autorelease异常
- 毕业两年,博客一年,时光
- web前端安全编码(模版篇)
- 简单的自动更新程序实现
- 《数据结构》第1章 绪论 知识点总结导图
- Android应用开发学习—Toast使用方法大全
- Windows_一些小功能
- iOS程序自动检测更新的实现
- 一日一图