CCHttpRequest 本身是一个CCObject 对象, 用于lua的create函数 默认会retain request对象一次,因此需要在lua的callback函数里面处理结束request之后,需要release对象否则会内存泄露。
实际的引用计数变化的过程如下:
new 引用计数 = 1
autorelease 引用计数先变成2 再变成1 , 将对象加入自动释放池子里面之后,对象引用计数会+1, 接着会调用对象的release方法,对象引用计数又减去1
retain 引用计数变成 2
start 开始http请求,对象加入schedule 的列表里面 引用计数+1 引用计数变成3
update 过程中,到下一个update循环的时候,对象的引用计数会减去1,因为自动释放池子release了这个对象,这时候引用计数变成2
http请求处理结束,update函数里面检测结束,取消schedule 更新,但是因为当前在函数体内,所以不会立即release掉request对象,而是等待本次回合结束的时候再release对象
http请求结束,在callback函数里面release 掉对象,引用计数-1 变成 1
在本次更新回合结束,schedule模块,将标记删除的对象的引用计数-1, 引用计数 = 0 对象被删除掉。
001 |
#include
"network/CCHttpRequest.h" |
002 |
#include
"network/CCHttpRequest_impl.h" |
005 |
#include
"CCLuaEngine.h" |
007 |
using namespace cocos2d; |
011 |
CCHttpRequest*
CCHttpRequest::createWithUrl(CCHttpRequestDelegate* delegate, |
013 |
CCHttpRequestMethod
method, |
014 |
bool isAutoReleaseOnFinish) |
016 |
CCHttpRequest*
request = new CCHttpRequest(delegate,
url, method, isAutoReleaseOnFinish); |
017 |
request->initHttpRequest(); |
018 |
request->autorelease(); |
019 |
if (isAutoReleaseOnFinish) |
026 |
CCHttpRequest*
CCHttpRequest::createWithUrlLua( int nHandler, const char *
url, bool isGet) |
028 |
CCHttpRequest*
request = new CCHttpRequest(NULL,
url, isGet?CCHttpRequestMethodGET:CCHttpRequestMethodPOST, true ); |
029 |
request->m_luaHandler
= nHandler; |
030 |
request->initHttpRequest(); |
031 |
request->autorelease(); |
033 |
CCLog( "request
count is? %d" ,
request->retainCount()); |
037 |
bool CCHttpRequest::initHttpRequest( void ) |
039 |
m_request
= new CCHttpRequest_impl(m_url.c_str(),
m_method); |
043 |
CCHttpRequest::~CCHttpRequest( void ) |
045 |
delete (CCHttpRequest_impl*)m_request; |
048 |
void CCHttpRequest::addRequestHeader( const char *
key, const char *
value) |
052 |
((CCHttpRequest_impl*)m_request)->addRequestHeader(key,
value); |
056 |
void CCHttpRequest::addPostValue( const char *
key, const char *
value) |
060 |
((CCHttpRequest_impl*)m_request)->addPostValue(key,
value); |
064 |
void CCHttpRequest::setPostData( const char *
data) |
068 |
((CCHttpRequest_impl*)m_request)->setPostData(data); |
072 |
void CCHttpRequest::setTimeout( float timeout) |
074 |
((CCHttpRequest_impl*)m_request)->setTimeout(timeout); |
077 |
bool CCHttpRequest::getIsInProgress( void ) |
079 |
return ((CCHttpRequest_impl*)m_request)->getIsInProgress(); |
082 |
void CCHttpRequest::start( bool isCached) |
084 |
CCDirector::sharedDirector()->getScheduler()->unscheduleUpdateForTarget( this ); |
085 |
if (((CCHttpRequest_impl*)m_request)->start()) |
087 |
CCDirector::sharedDirector()->getScheduler()->scheduleUpdateForTarget( this ,
0, false ); |
091 |
void CCHttpRequest::cancel( void ) |
093 |
CCDirector::sharedDirector()->getScheduler()->unscheduleUpdateForTarget( this ); |
094 |
((CCHttpRequest_impl*)m_request)->cancel(); |
097 |
void CCHttpRequest::clearDelegatesAndCancel( void ) |
103 |
int CCHttpRequest::getResponseStatusCode( void )
{ |
104 |
return ((CCHttpRequest_impl*)m_request)->getResponseStatusCode(); |
107 |
const char *
CCHttpRequest::getResponseString( void ) |
109 |
return ((CCHttpRequest_impl*)m_request)->getResposeString().c_str(); |
112 |
const void *
CCHttpRequest::getResponseData( int *
dataLength) |
114 |
return ((CCHttpRequest_impl*)m_request)->getResponseData(); |
117 |
int CCHttpRequest::getResponseDataLength() |
119 |
return ((CCHttpRequest_impl*)m_request)->getResponseDataLength(); |
122 |
CCHttpRequestError
CCHttpRequest::getErrorCode( void ) |
124 |
return ((CCHttpRequest_impl*)m_request)->getErrorCode(); |
127 |
const char *
CCHttpRequest::getErrorMessage( void ) |
129 |
return ((CCHttpRequest_impl*)m_request)->getErrorMessage(); |
132 |
void CCHttpRequest::update( float dt) |
134 |
CCLog( "update
Request state %d" ,
retainCount()); |
135 |
CCHttpRequest_impl*
request = (CCHttpRequest_impl*)m_request; |
136 |
if (!request
|| !request->getIsInProgress()) |
138 |
CCDirector::sharedDirector()->getScheduler()->unscheduleUpdateForTarget( this ); |
141 |
if (request->getIsCompleted()) |
143 |
if (m_delegate)
m_delegate->requestFinished( this ); |
147 |
bool isSuc
= (request->getErrorCode()==CCHttpRequestErrorNone); |
148 |
CCLuaEngine*
engine = CCLuaEngine::defaultEngine(); |
150 |
engine->getLuaStack()->clean(); |
151 |
engine->getLuaStack()->pushBoolean(isSuc); |
152 |
engine->getLuaStack()->executeFunctionByHandler(m_luaHandler,
1); |
153 |
CCLog( "afterHandler
retainCount %d" ,
retainCount()); |
166 |
else if (request->getIsCancelled()) |
168 |
if (m_delegate)
m_delegate->requestFailed( this ); |
172 |
CCLuaEngine*
engine = CCLuaEngine::defaultEngine(); |
174 |
engine->getLuaStack()->clean(); |
175 |
engine->getLuaStack()->pushBoolean( false ); |
176 |
engine->getLuaStack()->executeFunctionByHandler(m_luaHandler,
1); |