博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在请求完成后回调delegate的方法。然而回调时经常遇到这种情况:delegate已经被释放...
阅读量:6253 次
发布时间:2019-06-22

本文共 1778 字,大约阅读时间需要 5 分钟。

最近的项目遇到了网络请求,需要在请求完成后回调delegate的方法。然而回调时经常遇到这种情况:delegate已经被释放,这时调用其方法则会引起。

objc的runtime中有两种判断类型的方式比较靠谱,他们可以直接取得任意一个objc_object(和id是完全一样的数据类型)的类或者类名。其函数如下:

//Returns the class name of a given object.const char *object_getClassName(id obj); //Returns the class of an object.Class object_getClass(id object);

第一个函数可以返回任意一个id的类名,第二个函数可以返回任意一个id的Class。这两个函数各有优劣。使用第一个函数判断类型是否改变的优点是在 iphone开发环境下默认公开,可以随便调用,缺点是要使用几字节的内存空间用于存放字符串,而且做字符串比较要稍微多花费一些CPU时间。第二个函数 优点是可以将获取的Class指针做为int型保存起来,只需要4字节,且比较起来节约CPU时间,坏处是我们要手动声明一下此函数才可以在自己的代码里 使用,否则会出现一个,提示“Implicit declaration of function ‘object_getClass’ is invalid in C99”,不过手动声明一下只要加一行代码就可以,也不麻烦。

下面是一个实例:

// WebService.h#import 
@protocol ServiceDelegate;@interface WebService : NSObject { id
_myDelegate; Class _originalClass;}@property (nonatomic, assign) id myDelegate;- (void)postDataWithURL:(NSString *)myURL postData:(NSDictionary *)dataDic setDelegate:(id)theDelegate;- (void)serviceFun:(NSDictionary *)paramDic;@end@protocol ServiceDelegate
- (void)serviceCallBack:(id)resultObject serviceFlag:(NSInteger)flag;@end
// WebService.m#import "WebService.h"Class object_getClass(id object);@implementation WebService@synthesize myDelegate = _myDelegate;- (void)postDataWithURL:(NSString *)myURL postData:(NSDictionary *)dataDic setDelegate:(id)theDelegate{    self.myDelegate = theDelegate;    _originalClass = object_getClass(theDelegate);    [NSThread detachNewThreadSelector:@selector(serviceFun:) toTarget:self withObject:dataDic];}- (void)serviceFun:(NSDictionary *)paramDic{    Class currentClass = object_getClass(self.myDelegate);    if (currentClass == _originalClass) {        // 如果delegate没有被释放    }}@end

转载于:https://www.cnblogs.com/kiss007/archive/2012/12/13/2817000.html

你可能感兴趣的文章
异常:Project configuration is not up-to-date with pom.xml解决方案
查看>>
HDU2647 拓扑排序
查看>>
ThinkPHP/---微信支付PC流程
查看>>
JavaScript 05
查看>>
python 多线程编程之threading模块(Thread类)创建线程的三种方法
查看>>
实验三
查看>>
水仙花数
查看>>
P3308 [SDOI2014]LIS(最小割+退流)
查看>>
C语言作业--数据类型
查看>>
压位高精
查看>>
jsp 中对jar 包的引用
查看>>
python操作mysql数据库
查看>>
Yii: gii 403 Error you are not allowed to access this page
查看>>
计算汉字长度
查看>>
Codeforces 911E - Stack Sorting
查看>>
BZOJ 1853: [Scoi2010]幸运数字
查看>>
基于敏捷的测试交付物通用设计
查看>>
BFS --- 素数环
查看>>
for循环每次取出一个字符(不是字节)
查看>>
linux版本选择
查看>>