我遇到的问题与This problem someone posted on github完全相同。除非我添加
,否则GCDAsyncSocket不会连接 [NSThread sleepForTimeInterval:0.1]
在帖子的最后一篇文章中已发布
我想我解决了这个问题,因为我怀疑这完全是我的错。在建立连接之前,套接字的父对象是dealloc。如果我暂时在线程上睡觉,那么在dealloc之前建立连接(我现在只是在黑暗中拍摄)在我的父对象(委托人)上取得了保留。
我不明白这意味着什么或如何将其实现到我的代码中。到目前为止,我已尝试将socket
声明为(retain)
和(nonatomic, retain)
以及(Strong, Nonatomic)
。
感谢您抽出宝贵时间阅读我的问题。
答案 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