最近把一个游戏内嵌到app里,选用了微信开源的Mars,结果遇到了内存峰值。解决的方法很容易,加上@autoreleasepool就可以了。但是做实验的时候又有了好多疑惑,不停地往深处挖,最终了解了autoreleasepool的实现,Tagged Pointer,和NSString内存管理的特殊性。

Mars

我们做的小游戏需要实时传输数据,数据很小,就选用了Mars。结果内存一直涨,在这里加个autoreleasepool就可以避免内存峰值。

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的实现原理
这篇博客很不错,详细介绍了autoreleasepool的实现,图文并茂,很好理解。不过他提的3个场