autorelease对象什么时候释放?

 最近遇到一个问题,如下:
    我使用了一个aotorelease的对象进行异步网络数据请求,并设置了该异步网络数据请求对象的delegate为当前界面,请求开始前关闭了交互。当异步请求的数据返回后,则打开交互并根据返回的数据进行相应的提示。但是,有可能过了30秒,数据仍然没有返回,则认为网络超时(可能没有数据返回了,也有可能因为网络问题,数据返回很慢等),于是打开交互,可以让用户进行自由的操作。这时候问题出现了,如果用户离开当前界面,则当前界面的内存会被释放,但是前面已经设置了异步网络数据请求对象的delegate为当前界面,如果这时候数据返回了,会执行一个已释放的界面对象里面的回调函数,则程序崩溃。
    我想到的解决办法是用一个类成员变量来存储异步网络数据请求对象的地址,在界面类的dealloc函数里面将该异步网络数据请求对象的delegate置为nil。但是,经过测试,程序仍然会崩溃,报的错误是EXC_BAD_ACESS,不解。于是查找autorelease对象的释放机制。找到一个有参考价值的解释:
-----------------------------------------------------------------------------------------------------------------
(注:以下黑体为引用)
官方的文档上是这样写的:
The Application Kit creates an autorelease pool on the main thread at the beginning of every cycle of the event loop, and drains it at the end, thereby releasing any autoreleased objects generated while processing an event

也就是说在每个事件的开始时,Application Kit在main thread会自动创建一个autorelease pool,当这个事件结束时,会释放掉这个事件过程中所有产生的autoreleased的对象。 什么是事件呢,援引下面这段话:

Each external event triggers a cycle of the run loop e.g. mouse event, key press,recepit of data on an asynchronous HTTP connection etc. Also NSTimers,
也就是说,一个鼠标事件,键盘按下(MAC OSX),或者iphone上的触摸事件,异步http连接下后当接收完数据时,或者NSTimer的一次方法调用,都是一个事件。

所以,并非程序结束时,autoreleased的对象才会被释放。

                                                                                      

   异步http连接下后当接收完数据时autorelease对象会被释放,我豁然。

   我的问题的自然是不使用autorelease对象就能解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值