ios – nsdictionary中的块?

ios – nsdictionary中的块?,第1张

概述所以我将块动作存储到一个nsmutabledictionary中,然后当一个响应返回到websocket时调用它们.这会将异步请求转换为块语法.这是精简代码: - (void)sendMessage:(NSString*)message responseAction:(void (^)(id))responseAction{ NSString *correlationID = (NS 所以我将块动作存储到一个nsmutabledictionary中,然后当一个响应返回到websocket时调用它们.这会将异步请求转换为块语法.这是精简代码:

@H_404_11@- (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];足以将其从内存中删除.我记得pre-ARC,block_release是一个选项.

解决方法 您需要复制基于堆栈的块才能将它们安全地存储在容器中.

@H_404_11@[self.messageBlocks setobject:[responseAction copy] forKey:correlationID];

对于非ARC代码,您还需要 – 自动发布它.

@H_404_11@[self.messageBlocks setobject:[[responseAction copy] autorelease] forKey:correlationID];

希望有所帮助.

总结

以上是内存溢出为你收集整理的ios – nsdictionary中的块?全部内容,希望文章能够帮你解决ios – nsdictionary中的块?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1074293.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存