可能看到這個標題有點懵口予,先說說我遇到的情景商玫。
使用AsyncSocket+RPC進行的網(wǎng)絡(luò)通信的數(shù)據(jù)傳遞,AsyncSocket執(zhí)行的結(jié)果是在delegate中進行返回
袍辞,這里面所有的執(zhí)行代碼都被自己封裝到一個類中贸宏。
有時候網(wǎng)絡(luò)環(huán)境特別差的時候造寝。還沒有收到數(shù)據(jù)回掉,我就退回到上一個界面吭练,這時候恰巧數(shù)據(jù)回掉回來了诫龙,但是那個自定義的類已經(jīng)被釋放。就會crash掉鲫咽。(產(chǎn)生野指針)
要解決這個問題其實有兩個思路:
一)由于該類的釋放签赃,造成了野指針谷异,從而導(dǎo)致程序crash掉。那么我自己將這個類的生命周期強行改為從一開始創(chuàng)建直到程序完全退出锦聊,才會釋放歹嘹。那么我就使用單利
#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)協(xié)議
@property (nonatomic,assign) id<LGSocketServeDelegate> delegate;
2)定義局部變量
@interface LGSocketServe : NSObject{
Class _orignalCls;
}
3)添加set和get方法
實現(xiàn)協(xié)議的時候,手動去實現(xiàn)方法 設(shè)置局部變量(協(xié)議變量)
-(void)setDelegate:(id<textDelegate>)delegate{
del=delegate;
_orignalCls = object_getClass(del);
}
//獲取局部變量(協(xié)議變量) 的類型
-(Class)getdelegateClass{
return object_getClass(del);
}
4)調(diào)用的時候孔庭,加上一個判斷尺上,主要就是判斷該該協(xié)議是否被釋放
if(_orignalCls==[self getdelegateClass]) {
if([del respondsToSelector:@selector(getname:)]) {
[del getname:@"1111"];
}
}
這個方法適合異步的網(wǎng)絡(luò)請求和一些比較耗時的操作導(dǎo)致delegate崩潰的問題