objective-c中所谓的僵尸对象
2015-06-22 09:48
513 查看
正常情况下向已回收的对象发送消息时灵时不灵,具体要看该对象所占内存有没有被覆写。cocoa提供了僵尸对象(Zombie Object)这个功能,简单的说:启用该调试功能后,运行时会将所有已回收的实例转化为特殊的“僵尸对象”,而不会真正回收它们。这种对象在核心内存无法重用,因此不可能遭到覆写。僵尸对象收到消息后会抛出异常,其中说明了发送来的消息,并描述了回收之前的对象。僵尸对象是调试内存管理问题的最佳方式。
之要将环境变量NSZombieEnabled设为YES,即可启用该功能:
在Xcode中也可以打开次选项,在应用程序的Scheme里,具体版本的Xcode略有不同,大家可自行搜索。
下面写一段测试代码:
在未开启僵尸模式情况下执行结果为:
在已开启后结果如下:
注意以上代码编译不可以开启ARC模式,因为ARC模式不允许显示调用release方法。
下面再测试一下实际给僵尸对象发送消息结果如何:
实际上以上代码编译和执行环境为ubuntu,如果在OSX中,反馈效果会更好。
之要将环境变量NSZombieEnabled设为YES,即可启用该功能:
export NSZombieEnabled="YES" ./xxx #或者 NSZombieEnabled="YES" ./xxx
在Xcode中也可以打开次选项,在应用程序的Scheme里,具体版本的Xcode略有不同,大家可自行搜索。
下面写一段测试代码:
#import <Foundation/Foundation.h> @interface HyClass:NSObject @end @implementation HyClass @end void show_class_info(id obj){ Class cls = object_getClass(obj); //Class cls = [obj class]; Class scls = class_getSuperclass(cls); NSLog(@"%s : %s",class_getName(cls),class_getName(scls)); } int main(void){ @autoreleasepool{ HyClass *obj = [[HyClass alloc] init]; NSLog(@"Before release:"); show_class_info(obj); [obj release]; NSLog(@"After release:"); show_class_info(obj); } return 0; }
在未开启僵尸模式情况下执行结果为:
wisy@wisy-pad:~/src/objc_src/linux$ ./z 2015-06-22 09:28:47.752 z[2120:2120] Before release: 2015-06-22 09:28:47.784 z[2120:2120] HyClass : NSObject 2015-06-22 09:28:47.784 z[2120:2120] After release: 段错误 (核心已转储)
在已开启后结果如下:
wisy@wisy-pad:~/src/objc_src/linux$ NSZombieEnabled="YES" ./z 2015-06-22 09:29:35.566 z[2131:2131] Before release: 2015-06-22 09:29:35.581 z[2131:2131] HyClass : NSObject 2015-06-22 09:29:35.581 z[2131:2131] After release: 2015-06-22 09:29:35.581 z[2131:2131] NSZombie : nil
注意以上代码编译不可以开启ARC模式,因为ARC模式不允许显示调用release方法。
下面再测试一下实际给僵尸对象发送消息结果如何:
[obj description]; //运行结果: 2015-06-22 09:55:51.710 z[2828:2828] *** -[HyClass description]: message sent to deallocated instance 0x1b95990
实际上以上代码编译和执行环境为ubuntu,如果在OSX中,反馈效果会更好。
相关文章推荐
- Java "object reference" demo
- Java object demo
- lock_type动态视图_V$LOCK,V$LOCKED_OBJECT
- Object-C 中拒绝使用==判断两个对象相等
- [玩玩Objective-C]之协议(Protocol)
- [玩玩Objective-C]之分类(Category)
- oc 的优缺点
- Object基础语法Category、Extension、Protocol
- object sender,EventArgs e .
- C#高级编程十七天----Object类
- 使用对象输入输出流(ObjectOutputStream,ObjectInputStream)实现序列化对象的深度克隆
- 黑马程序员——Java基础---面向对象(Eclipse、Object类、String类)
- 学习笔记(objective-c)-协议(proto 4000 col)
- [玩玩Objective-C]之动态绑定
- New XAMPP security concept: Access to the requested object is only available from the local network
- Objective-C 语法之 Debug 表达式
- Objective-C----内存管理
- Objective-c 算术函数和常量代表
- Objective-C----NSDate、NSDateFormatter
- Objective-C----多态