我遇到的问题与This problem someone posted on github完全相同。除非我添加,否则GCDAsyncSocket不会连接[NSThread sleepForTimeInterval:0.1]
在线程的最后一个帖子中
我想我解决了这个问题,而且我怀疑那完全是我的错。在建立连接之前,套接字的父对象已被取消分配。如果我暂时在线程上睡觉,那么连接是在dealloc之前完成的(我现在只是在黑暗中拍摄)保留了我的父对象(委托)。
我不明白这是什么意思或如何在我的代码中实现它。到目前为止,我已经尝试将socket
声明为(retain)
和(nonatomic, retain)
和(Strong, Nonatomic)
。
感谢您抽出宝贵的时间阅读我的问题。
最佳答案
改写您引用的帖子,这是一个内存管理问题;您需要确保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
关于ios - GCDAsyncSocket委托(delegate)调用不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29191502/