HttpClient 释放过度

cocos2dx3.3 版本 最近iOS 经常会crash,发现斗士httpClient的问题。错误如下

cocos2d::network::HttpClient::networkThreadAlone(cocos2d::network::HttpRequest*)::_0::operator()() const (HttpClient.cpp:186) 10 MDS2 iOS 0x10056d164 void std::__1::__invoke_void_return_wrapper<void>::__call<cocos2d::network::HttpClient::networkThreadAlone(cocos2d::network::HttpRequest*)::_0&>(cocos2d::network::HttpClient::networkThreadAlone(cocos2d::network::HttpRequest*)::_0&&&) (__functional_base:440) 11 MDS2 iOS 0x10056cfdc std::__1::__function::__func<cocos2d::network::HttpClient::networkThreadAlone(cocos2d::network::HttpRequest*)::_0, std::__1::allocatorcocos2d::network::HttpClient::networkThreadAlone(cocos2d::network::HttpRequest*)::$_0, void ()>::operator()() (functional:1407)
12 MDS2 iOS 0x1005f9e2c std::__1::function<void ()>::operator()() const (functional:1793)
13 MDS2 iOS 0x10051eef8 cocos2d::Scheduler::update(float) (CCScheduler.cpp:979)
14 MDS2 iOS 0x10058da0c cocos2d::Director::drawScene() (CCDirector.cpp:267)
15 MDS2 iOS 0x100591778 cocos2d::DisplayLinkDirector::mainLoop() (CCDirector.cpp:1295)
16 MDS2 iOS 0x10099e23c - (CCDirectorCaller-ios.mm:110)
17 QuartzCore 0x1843eb814 CA::Display::DisplayLinkItem::dispatch() + 40
18 QuartzCore 0x1843eb6c8 CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 424
19 IOKit 0x181f161e8 IODispatchCalloutFromCFMessage + 372
20 CoreFoundation 0x181c431f8 __CFMachPortPerform + 180
21 CoreFoundation 0x181c59634 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 56
22 CoreFoundation 0x181c58d6c __CFRunLoopDoSource1 + 436
23 CoreFoundation 0x181c56ac4 __CFRunLoopRun + 1800
24 CoreFoundation 0x181b85680 CFRunLoopRunSpecific + 384
25 GraphicsServices 0x183094088 GSEventRunModal + 180
26 UIKit 0x1869fcd90 UIApplicationMain + 204
27 MDS2 iOS 0x10007ea20 main (main.m:13)
28 libdyld.dylib 0x1817268b8 start + 4

Global Trace Buffer (reverse chronological seconds):
139.160169 CFNetwork 0x000000018231b104 TCP Conn 0x15380eb80 complete. fd: 13, err: 0
139.161516 CFNetwork 0x000000018231c630 TCP Conn 0x15380eb80 event 1. err: 0
139.186070 CFNetwork 0x000000018231c708 TCP Conn 0x15380eb80 started
139.190797 CFNetwork 0x00000001823718bc Creating default cookie storage with default identifier
139.190797 CFNetwork 0x0000000182371888 Faulting in CFHTTPCookieStorage singleton
139.190908 CFNetwork 0x00000001823c3558 Faulting in

看错误好像说是HttpClient.cpp:186 行的。也就是 下面红色的代码

// Worker thread
void HttpClient::networkThreadAlone(HttpRequest* request)
{
// Create a HttpResponse object, the default setting is http access failed
HttpResponse *response = new (std::nothrow) HttpResponse(request);
char errorBuffer = { 0 };
processResponse(response, errorBuffer);

autoscheduler = Director::getInstance()->getScheduler();
scheduler->performFunctionInCocosThread({
const ccHttpRequestCallback& callback = request->getCallback();
Ref* pTarget = request->getTarget();
SEL_HttpResponse pSelector = request->getSelector();

    if (callback != nullptr)
    {
        callback(s_pHttpClient, response);
    }
    else if (pTarget && pSelector)
    {
        (pTarget->*pSelector)(s_pHttpClient, response);
    }
    response->release();

// do not release in other thread
request->release();
});
}

看注释说需要释放的,但有时候会因为这个crash掉,求各位解答。谢谢。

你外面调用时候的 HttpRequest 有没有 release?

外边应该是没有的,外边 lua写的,
local request = cc.XMLHttpRequest:new()
request.responseType =cc.XMLHTTPREQUEST_RESPONSE_JSON
request:setRequestHeader(“Accept-Encoding”,“gzip,deflate”)
request:open(“POST”, url)
request:registerScriptHandler(requestFinish)
request:send(paramterStr)

这个不是必现的,出现的概率比较低,但一天总会出现3到4次。

luabinding不熟悉,
你别用 封装过的 xhr
直接用 HttpRequest 试试.

HttpClient::getInstance()->send(request);

lua里要是没有 binding 就自己在c里写个封装

有没有可能 scheduler->performFunctionInCocosThread({
const ccHttpRequestCallback& callback = request->getCallback();
Ref* pTarget = request->getTarget();
SEL_HttpResponse pSelector = request->getSelector();

    if (callback != nullptr)
    {
        callback(s_pHttpClient, response);
    }
    else if (pTarget && pSelector)
    {
        (pTarget->*pSelector)(s_pHttpClient, response);
    }
    
    response->release();
    // do not release in other thread
    request->release();
    
});

这里返回的request和response里面那个request不是同一个对象?

这个回调函数感觉不需要传request过来的,这样写,一个response就够了

scheduler->performFunctionInCocosThread({
    HttpRequest *request=response->getHttpRequest();
    const ccHttpRequestCallback& callback = request->getCallback();
    Ref* pTarget = request->getTarget();
    SEL_HttpResponse pSelector = request->getSelector();

    if (callback != nullptr)
    {
        callback(s_pHttpClient, response);
    }
    else if (pTarget && pSelector)
    {
        (pTarget->*pSelector)(s_pHttpClient, response);
    }
    
    response->release();
    // do not release in other thread
    request->release();
    
});