剖析dealloc

   请结合本博客中的《delloc和release的关系》进行阅读。 


dealloc在oc的内存管理中存在着不可替代的作用,在内存的引用计数为0的时候,它会自动被系统调用,将内存释放掉,但是dealloc到底是如何运作的呢?

    首先来看下面这段程序

   NSMutableString * s=[[NSMutableString alloc]initWithString:@"beijing"];

   [s   release];

   NSLog(@"s:%d",s.retaincount);

   这段程序对不对?

   通过运行这段程序,xcode告诉我们,这段程序可对可以不对,但是实际上,这段程序是不对的,xcode将会报错,为什么呢?下面就讲解一下dealloc的运行机制;

   dealloc在内存引用计数为0的时候将被系统自动调用,并且将内存中释放掉,但是dealloc方法并不是在引用计数为0的时候立即将内存释放掉,或许这要看系统的“心情”,

这就导致了这样一个问题,我们什么时候才能知道dealloc方法被调用了呢?

    可以在dealloc方法里面加上标记,来判定,系统是否调用了dealloc方法

   -(void)dealloc

{

[super release];

nslog(@"i have been freed");


}

    回到上面的程序,为什么会出现时对时不对的情况,也就一目了然了,如果dealloc方法在NSLog(@"s:%d",s.retaincount)之前运行,那么再执行这句话的时候,系统肯定会报错,而如果dealloc方法在在NSLog(@"s:%d",s.retaincount)之后运行,系统将正常运行;


    dealloc之后,指针是如何处理的,是否会将指针置空呢?假设指针是空的,我们来证明这个结论

   先看程序

   NSMutableString * s=[[NSMutableString alloc]initWithString:@"beijing"];

   [s   release];

//nslog(@“s:%p”,s);

-(void)dealloc

{

[super release];

nslog(@"%p",self);

}

  xcode运行之后,内存地址并没有改变,还是原来的地址!也就是说dealloc方法并没有将指针置空;


  dealloc能否能被手动调用呢,答案是可以的,但是最好不要这么做,否则很有可能造成内存的过度释放,系统崩溃;


综上所述:delloc方法只将内存释放,而并没有对指针进行操作,不能手动调用dealloc方法,以免造成内存过度释放和对象引用出错,内存的引用跟内存是密切相关的,没有内存,就没有引用;没有引用,内存也将没有意义。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值