GCDAsyncSocket委托调用不起作用

时间:2015-03-22 05:58:51

标签: ios objective-c sockets automatic-ref-counting gcdasyncsocket

我遇到的问题与This problem someone posted on github完全相同。除非我添加

,否则GCDAsyncSocket不会连接

[NSThread sleepForTimeInterval:0.1]

在帖子的最后一篇文章中已发布

  

我想我解决了这个问题,因为我怀疑这完全是我的错。在建立连接之前,套接字的父对象是dealloc。如果我暂时在线程上睡觉,那么在dealloc之前建立连接(我现在只是在黑暗中拍摄)在我的父对象(委托人)上取得了保留。

我不明白这意味着什么或如何将其实现到我的代码中。到目前为止,我已尝试将socket声明为(retain)(nonatomic, retain)以及(Strong, Nonatomic)

感谢您抽出宝贵时间阅读我的问题。

1 个答案:

答案 0 :(得分:1)

要重新引用您引用的帖子,这是一个内存管理问题;您需要确保GCDAsyncSocket实例足够长时间才能建立连接,从服务器获得回复,等等。如果您正在使用属性将套接字的所有权转移到您自己的类,那么这意味着拥有该套接字的对象也需要坚持下去。

请记住套接字对象是异步工作的,因此调用-connect并不是一个等待连接发生的自包含操作。它只是在另一个线程上开始滚动并立即继续前进。

如果没有看到有问题的代码,很难确切地说出你的情况出了什么问题。但是,假设你有类似的东西:

@interface MyController : NSObject
@property (strong, nonatomic) GCDAsyncSocket *socket;
@end

那么最可能的罪魁祸首是你的MyController实例过早被解除分配,所以你要在所有权链中检查你的内存管理,确保你的强引用只要你坚持期待他们。

有关对象所有权和对象生命周期如何工作的更多详细信息,请查看Apple的内存管理指南:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html