ios异步delegate崩溃

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

使用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崩溃的问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,611评论 8 265
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 4,348评论 0 11
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,211评论 30 472
  • 土豆很喜欢发小脾气,像所有恋爱中的姑娘。例如,昨晚西红柿没有说晚安,或者说晚安没有说我爱你;今天食堂没有爱吃的菜,...
    dcecd4039fbb阅读 459评论 0 1
  • 将业务分解,清楚的知道现金流和业务之间的关系,通过波士顿矩阵,动态的寻找最佳组合方案,清晰后期的发力点与发展方向。
    肉豆须张巍阅读 306评论 0 0