剖析dealloc

剖析dealloc,第1张

概述   请结合本博客中的《delloc和release的关系》进行阅读。  dealloc在oc的内存管理中存在着不可替代的作用,在内存的引用计数为0的时候,它会自动被系统调用,将内存释放掉,但是dealloc到底是如何运作的呢?     首先来看下面这段程序    NSMutableString * s=[[NSMutableString alloc]initWithString:@"beijin

   请结合本博客中的《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方法,以免造成内存过度释放和对象引用出错,内存的引用跟内存是密切相关的,没有内存,就没有引用;没有引用,内存也将没有意义。

总结

以上是内存溢出为你收集整理的剖析dealloc全部内容,希望文章能够帮你解决剖析dealloc所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1053738.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存