一个关于NSLog和对象释放谁先为程序执行的问题?

发布日期:2018-05-27 来源:财富国际在线 阅读:

一个关于NSLog和对象释放谁先为程序执行的问题?

kubisoft 5小时前 111 char const foundation 下面是我编写的Objective代码: main.m #import <Foundation/Foundation.h> #import "XYZPerson.h" int main(int argc, const char * argv[]) { @autoreleasepool { XYZPerson *firstPerson = [XYZPerson personWithFirstName:@"Ronnie" lastName:@"O'Sullivan" dateOfBirth:nil]; [firstPerson sayHello]; firstPerson = nil; NSLog(@"The firstPerson object has been delloced from the memory"); } return 0; } XYZPerson.h … 0 0 其他回答 autoreleasepool在处理这个对象,分配的对象放入pool, 不管你现在怎么折腾,等这一轮NSLoop结束之后自动释放pool里面的所有对象。
这个跟arc和retain/release是分开的另一套机制,为了简化内存管理而建立的autorelease pool这么一套机制。
------------------
你说的这个设置为nil之后释放,是针对arc而言。arc是在设置为nil之后,自动插入release的代码,而release代码执行时看到引用计数为0,就调用dealloc了。
----------------------------------------------
一块内存,只要没有去释放它,他就会活得很好。
那么谁去释放它、什么时机去释放它呢?
传统的c/c++的做法是,栈上的,超出了作用域就释放;堆上的,应用程序的代码自己去释放。
后来,堆上的对象越来越多,就不得不搞得更复杂一些:
java等语言的GC, 是定期或者不定期的由捡垃圾的清洁工(GC线程)来释放。那么到底是不是垃圾,也由GC线程来判断。这个代价相当大,所以GC线程是很低的优先级来执行。判断是不是垃圾,这事儿其实很复杂,光靠引用计数是不够的,因为经常会发生循环引用的问题。早期某个版本的JVM还有这么一种GC的方式:准备另外一块很大的内存,把所有引用到的对象都复制过去,然后把原来的内存全部回收。
而objective c为了保持高效率,采用的是半自动的retain/release的方式。说真的,非常不好用,我一直没弄明白~~~甚至我都不知道自己没弄明白,以为很简单,然后用instrument一调试,才发现我用错了,到处都是内存漏洞~~~
可是苹果的一个高手,发明了一套静态分析代码,在编译的时候发现内存漏洞的技术。只要按shift-command-B, 就会帮你分析内存漏洞。后来就搞出了苹果自己的ARC, 这个可不是GC那一套,而是靠这种静态分析内存漏洞的技术,来帮你自动在需要的地方插入retain/release等等代码。
---------------------
pool里面的对象,都有pool去引用啊,引用计数并不会变为0.
pool里面的对象是在跑出autoreleasepool{}作用域的时候自动释放的,所以arc不用多管闲事去再插release的代码。 白起 4小时前 0条评论 0 0 你把@autoreleasepool 给去了看看 Bill Cheng 4小时前 0条评论 0 0 登录后可回答 提交回答
关键词 :

关于我们 联系我们招聘信息免责申明广告服务 网站地图 百度地图 TAG标签

Copyright@2018-2022 Cfgjzx.Com 财富国际在线 版权所有 All Rights Reserved   
财富国际提供:最新财富资讯、房产资讯、股票资讯、区块链、投资理财、保险导购、健康产品、公私募基金,易经等资讯及服务.