美文网首页
ios异步delegate崩溃

ios异步delegate崩溃

作者: 一只努力的猿 | 来源:发表于2018-06-11 14:46 被阅读0次

    可能看到这个标题有点懵,先说说我遇到的情景。

    使用AsyncSocket+RPC进行的网络通信的数据传递,AsyncSocket执行的结果是在delegate中进行返回
    ,这里面所有的执行代码都被自己封装到一个类中。
    有时候网络环境特别差的时候。还没有收到数据回掉,我就退回到上一个界面,这时候恰巧数据回掉回来了,但是那个自定义的类已经被释放。就会crash掉。(产生野指针)

    要解决这个问题其实有两个思路:
    一)由于该类的释放,造成了野指针,从而导致程序crash掉。那么我自己将这个类的生命周期强行改为从一开始创建直到程序完全退出,才会释放。那么我就使用单利

    #pragma mark public static methods
    static LGSocketServe *socketServe = nil;
    + (LGSocketServe *)sharedSocketServe {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            socketServe = [[LGSocketServe alloc] init];
        });    
        return socketServe;
    }
    

    二)我们可以使用RunTime进行判断
    添加头文件

    #import <objc/runtime.h>
    

    1)协议

    @property (nonatomic,assign) id<LGSocketServeDelegate> delegate;
    

    2)定义局部变量

        @interface LGSocketServe : NSObject{
            Class     _orignalCls;
          }
    

    3)添加set和get方法

    实现协议的时候,手动去实现方法 设置局部变量(协议变量)
        -(void)setDelegate:(id<textDelegate>)delegate{
            del=delegate;
            _orignalCls = object_getClass(del);     
        }
    
        //获取局部变量(协议变量)  的类型
        -(Class)getdelegateClass{
            return  object_getClass(del);
        }
    

    4)调用的时候,加上一个判断,主要就是判断该该协议是否被释放

        if(_orignalCls==[self getdelegateClass])  {
                if([del respondsToSelector:@selector(getname:)]) {
                    [del getname:@"1111"];
                }
          }
    

    这个方法适合异步的网络请求和一些比较耗时的操作导致delegate崩溃的问题

    相关文章

      网友评论

          本文标题:ios异步delegate崩溃

          本文链接:https://www.haomeiwen.com/subject/jkkheftx.html