最近把一個游戲內(nèi)嵌到app里,選用了微信開源的Mars,結(jié)果遇到了內(nèi)存峰值。解決的方法很容易,加上@autoreleasepool就可以了。但是做實(shí)驗(yàn)的時候又有了好多疑惑,不停地往深處挖,最終了解了autoreleasepool的實(shí)現(xiàn),Tagged Pointer,和NSString內(nèi)存管理的特殊性。
Mars
我們做的小游戲需要實(shí)時傳輸數(shù)據(jù),數(shù)據(jù)很小,就選用了Mars。結(jié)果內(nèi)存一直漲,在這里加個autoreleasepool就可以避免內(nèi)存峰值。
void StnCallBack::OnPush(int32_t _cmdid, const AutoBuffer& _msgpayload) { if (_msgpayload.Length() > 0) { @autoreleasepool { NSData *recvData = [NSData dataWithBytes:(const void *)_msgpayload.Ptr() length:_msgpayload.Length()]; [[TRSocketManager sharedInstance] OnPushWithCmd:_cmdid data:[[NSString alloc] initWithData:recvData encoding:NSUTF8StringEncoding]]; } } }
autoreleasepool
Objective-C Autorelease Pool的實(shí)現(xiàn)原理
這篇博客很不錯,詳細(xì)介紹了autoreleasepool的實(shí)現(xiàn),圖文并茂,很好理解。不過他提的3個場