我遇到的问题与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/

10-13 04:31