Ios 字典中的块?

Ios 字典中的块?,ios,cocoa-touch,websocket,objective-c-blocks,nsmutabledictionary,Ios,Cocoa Touch,Websocket,Objective C Blocks,Nsmutabledictionary,所以我将块操作存储到nsmutabledictionary中,然后在websocket上返回响应时调用它们。这将异步请求转换为块语法。下面是简化的代码: - (void)sendMessage:(NSString*)message responseAction:(void (^)(id))responseAction { NSString *correlationID = (NSString*)[[message JSONValue] objectForKey:@"correlati

所以我将块操作存储到nsmutabledictionary中,然后在websocket上返回响应时调用它们。这将异步请求转换为块语法。下面是简化的代码:

- (void)sendMessage:(NSString*)message responseAction:(void (^)(id))responseAction
{ 
    NSString *correlationID =  (NSString*)[[message JSONValue] objectForKey:@"correlationId"];

    [self.messageBlocks setObject:responseAction forKey:correlationID];

    NSLog(@"Sending message: %@", correlationID);
   [webSocket send:message];
}

- (void)webSocket:(SRWebSocket *)wsocket didReceiveMessage:(id)message;
{
    NSString *correlationID = (NSString*)[[message JSONValue] objectForKey:@"correlationId"];
    NSLog(@"Incoming message. CorrelationID: %@", correlationID);
    void (^action)(id) = nil;
    if (correlationID) {
        action = [messageBlocks objectForKey:correlationID];
        if (action) action([message JSONValue]);
        [messageBlocks removeObjectForKey:correlationID];
    }
}
注意:服务器使用随请求一起发送的correlationID进行响应。因此,每个响应都通过该id链接到每个请求


这很好,比我想象的要好。我的问题是这样运行块安全吗?正在调用[messageBlocks removeObjectForKey:correlationID];足以将其从内存中删除。我记得弧前,block_释放是一种选择

您需要复制基于堆栈的块,以便将它们安全地存储在容器中

[self.messageBlocks setObject:[responseAction copy] forKey:correlationID];
对于非ARC代码,您还需要
-autorelease

[self.messageBlocks setObject:[[responseAction copy] autorelease] forKey:correlationID];
希望有帮助