【发布时间】:2013-05-20 10:44:25
【问题描述】:
我是否遗漏了什么,或者调用 sendData 我真的需要像这样在堆上创建 3 个 NS 对象吗?或者这甚至是在堆上创建的?反正有没有在堆栈上创建它们?这似乎效率低下!
NSData *data = [NSData dataWithBytes:packet->data length:packet->dataLength];
if(!data)
return -5;
NSString *player = [NSString initWithCString:(char*)peer->data encoding:NSASCIIStringEncoding];
if(!player)
return -6;
NSArray *to = [NSArray arrayWithObject:player];
if(!to)
return -7;
NSError *error;
BOOL success = [[GCHelper sharedInstance].match sendData:data toPlayers:to withDataMode:GKMatchSendDataReliable error:&error];
if (!success) {
printf("Error sending packet %08x %d\n", packet->data, packet->dataLength);
return -8;
}
我可以这样做吗?
NSData data;
[data dataWithBytes:packet->data length:packet->dataLength];
NSString player;
[player initWithCString:(char*)peer->data encoding:NSASCIIStringEncoding];
NSArray to;
[to arrayWithObject:player];
抱歉我的无知,我精通 C++,但对 Objective-C 很陌生。
【问题讨论】:
-
正如 CodaFi 指出的那样,您渴望 C++ 的堆栈分配对象(在某些情况下具有优势,但在某些其他情况下也从根本上被破坏,除非标准已得到修复 - 您可以或可以,最终得到带有错误 vtable 的对象,但我离题了)。如果这不是过早的优化,您可以通过在任何类
GCHelper.sharedInstance.match上声明一个方法来解决该问题,该方法直接采用您的char *等,并从那些没有将它们包装和解包为堆对象的数据包中构造数据包。 HTH。 -
sendData 是一个 GameKit API 调用,是不是不能像你建议的那样声明另一个函数?
-
不幸的是,如果你调用一个框架,你需要另一个解决方案。写得太长了,我已经添加了答案。
标签: objective-c optimization memory-management stack