objective-c中所谓的僵尸对象

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

                       

正常情况下向已回收的对象发送消息时灵时不灵,具体要看该对象所占内存有没有被覆写。cocoa提供了僵尸对象(Zombie Object)这个功能,简单的说:启用该调试功能后,运行时会将所有已回收的实例转化为特殊的“僵尸对象”,而不会真正回收它们。这种对象在核心内存无法重用,因此不可能遭到覆写。僵尸对象收到消息后会抛出异常,其中说明了发送来的消息,并描述了回收之前的对象。僵尸对象是调试内存管理问题的最佳方式。
之要将环境变量NSZombieEnabled设为YES,即可启用该功能:

export NSZombieEnabled="YES"./xxx#或者NSZombieEnabled="YES" ./xxx
   
   
  • 1
  • 2
  • 3
  • 4

在Xcode中也可以打开次选项,在应用程序的Scheme里,具体版本的Xcode略有不同,大家可自行搜索。
下面写一段测试代码:

#import <Foundation/Foundation.h>@interface HyClass:NSObject@end@implementation HyClass@endvoid 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;}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

在未开启僵尸模式情况下执行结果为:

wisy@wisy-pad:~/src/objc_src/linux$ ./z2015-06-22 09:28:47.752 z[2120:2120] Before release:2015-06-22 09:28:47.784 z[2120:2120] HyClass : NSObject2015-06-22 09:28:47.784 z[2120:2120] After release:段错误 (核心已转储)
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

在已开启后结果如下:

wisy@wisy-pad:~/src/objc_src/linux$ NSZombieEnabled="YES" ./z2015-06-22 09:29:35.566 z[2131:2131] Before release:2015-06-22 09:29:35.581 z[2131:2131] HyClass : NSObject2015-06-22 09:29:35.581 z[2131:2131] After release:2015-06-22 09:29:35.581 z[2131:2131] NSZombie : nil
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

注意以上代码编译不可以开启ARC模式,因为ARC模式不允许显示调用release方法。
下面再测试一下实际给僵尸对象发送消息结果如何:

[obj description];//运行结果:2015-06-22 09:55:51.710 z[2828:2828] *** -[HyClass description]: message sent to deallocated instance 0x1b95990
   
   
  • 1
  • 2
  • 3

实际上以上代码编译和执行环境为ubuntu,如果在OSX中,反馈效果会更好。

           

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/qq_43678568/article/details/87876424