在nsdictionary块?

所以我将阻止行为存储到nsmutabledictionary中,然后在WebSocket上回应响应时调用它们。 这将asynchronous请求转换为块语法。 这是精简的代码:

- (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]; } } 

注意:服务器用与请求一起发送的关联ID进行响应。 所以每个响应都通过这个ID链接到每个请求。

这完美,比我预期的更好。 我的问题是,这样运行块是否安全? 正在调用[messageBlocks removeObjectForKey:correlationID]; 足以将其从内存中移除。 我记得前ARC,block_release是一个选项。

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

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

对于非ARC代码,您还需要将其-autorelease为。

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

希望有所帮助。