最近把一個游戲內(nèi)嵌到app里,選用了微信開源的Mars,結(jié)果遇到了內(nèi)存峰值。解決的方法很容易,加上@autoreleasepool就可以了。但是做實驗的時候又有了好多疑惑,不停地往深處挖,最終了解了autoreleasepool的實現(xiàn),Tagged Pointer,和NSString內(nèi)存管理的特殊性。

Mars

我們做的小游戲需要實時傳輸數(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的實現(xiàn)原理
這篇博客很不錯,詳細介紹了autoreleasepool的實現(xiàn),圖文并茂,很好理解。不過他提的3個場