【问题标题】:Objective-C NSMutableArray of sockets?Objective-C NSMutableArray 的套接字?
【发布时间】:2010-08-12 02:36:47
【问题描述】:

我想在一个 ArrayList/NSMutableArray 中存储几个套接字,但是这些套接字是 int 类型的,而 NSMutableArray 只接受对象 (id)。是否有另一种数据类型可以用作套接字的容器?我不确定我会有多少条目,所以我希望数据容器像一个 ArrayList。

谢谢!

编辑:我尝试将套接字作为 NSNumber 发送,但是当我尝试使用套接字发送消息时它不起作用并导致 XCode 崩溃。

【问题讨论】:

  • 你能贴出你试过的代码吗?因为通常,它运作良好。也许你没有从 NSNumber 中得到 intValue

标签: iphone objective-c sockets arraylist nsmutablearray


【解决方案1】:

您应该将文件描述符包装在NSFileHandle 实例中,这些将在NSArray 等集合对象中发挥良好作用,并且旨在包装文件描述符(如套接字)。它们还允许您在通信中使用标准 Foundation 类型,例如 NSData

int s = socket(AF_INET, SOCK_STREAM, 0);

if (s != -1)
{
    // bind or connect to address

    NSFileHandle *mySock = [[NSFileHandle alloc] initWithFileDescriptor:s closeOnDealloc:YES];

    [myMutableArray addObject:mySock];
}

请注意,NSFileHandle 还提供了用于异步接受连接以及异步 I/O 的便捷方法。您可以使用fileDescriptor 方法取回原始文件描述符。

【讨论】:

    【解决方案2】:

    您可以将 int 包装在 NSNumber 中,例如:

    NSNumber *socket = [NSNumber numberWithInt:socketInt];
    [myArray addObject:socket];
    NSNumber *getSocket = [myArray objectAtIndex:0];
    int getSocketInt = [getSocket intValue];
    

    More here

    【讨论】:

    • 因此,您应该发布您尝试过的代码。这里肯定有一些内存管理问题
    • 啊,其实你是对的。谢谢!我正在这样做: [NSThread detachNewThreadSelector:@selector(sendMessage:) toTarget:self withObject:socket];而socket是一个int。我把它改成早了。
    • 是的,只要把 NSNumber 放在那里,当你真正需要 int 的时候把它包起来:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多