0

我错过了什么,或者调用 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 很陌生。

4

2 回答 2

1

我可以做这样的事情吗?

不。除了事实上-init和朋友没有进行实际初始化(看看 NSObject.mm,它所做的只是return self;),你只是用这些调用传递 nil 消息。 +alloc仅存在提供独立于实现的分配器功能;碰巧在堆上分配对象的一种。如果您担心 Objective-C 本身的性能,那么您不必使用它。您可以随时回到 C 和 C++,回到您熟悉和喜爱的堆栈分配变量和复杂指针运算领域。Objective-C 仍然是一种高性能语言,尽管它“效率低下”。

但请记住:虽然 C 和 C++ 是为内存和处理器效率为王的嵌入式系统和任务关键型应用程序设计的,但 Objective-C 旨在运行在相当一致、高性能和(相对)内存不受限制的硬件上。

于 2013-05-24T18:55:56.167 回答
1

如果性能是一个问题,您的替代方案。正如您在回答我对这个问题的评论时正确指出的那样,不幸的是,您不能在调用框架时添加自己的方法,该方法将您的数据作为 C 指针。但是,您可以在上一级做类似的事情,您可以创建NSData并且NSString 无需将数据本身复制到堆中:

NSData *data = [NSData dataWithBytesNoCopy:packet->data
                                    length:packet->dataLength
                              freeWhenDone:NO];
if(!data)
   return -5;

NSString *player = [NSString initWithBytesNoCopy:peer->data
                                          length:strlen(peer->data)
                                        encoding:NSASCIIStringEncoding
                                    freeWhenDone:NO];
if(!player)
   return -6;

NSError *error;
BOOL success = [[GCHelper sharedInstance].match sendData:data
                                               toPlayers:@[player] // array expression
                                            withDataMode:GKMatchSendDataReliable
                                                   error:&error];
if (!success)
{
   printf("Error sending packet %08x %d\n", packet->data, packet->dataLength);
   return -8;
}

这仍然将您的数据包装为堆对象,但不会直接引用您的数据NSData和堆对象。NSString当然,您必须确保您的数据在需要时保持有效!

注意:如果你正在进入 Objective-C 并且经常需要这个功能,那么你可以将上面的代码作为一个类别包装起来GKMatch——这留作练习:-)

于 2013-05-25T02:22:23.440 回答