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

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时间,坏处是我们要手动声明一下此函数才可以在自己的代码里 使用,否则会出现一个warning,提示“Implicit declaration of function ‘object_getClass’ is invalid in C99”,不过手动声明一下只要加一行代码就可以,也不麻烦。

下面是一个实例:

// WebService.h#import <Foundation/Foundation.h>@protocol ServiceDelegate;@interface WebService : NSObject {id <ServiceDelegate> _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 <NSObject>
- (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

在请求完成后回调delegate的方法。然而回调时经常遇到这种情况:delegate已经被释放...相关推荐

  1. 多个Ajax请求成功后再执行后续方法

    经常会遇到需要ajax请求完毕后调用某方法,这次是多个ajax请求成功后,用它们返回的数据传参给回调方法,查询了一下,可以用jquery中的 $.when(),使用方法如下: $.when( $.aj ...

  2. 【jquery】ajax 请求成功后新开窗口被拦截解决方法

    问题: 前面开发项目时碰到一个问题,ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是很可惜被浏览器给拦截了,怎么解决这个问题呢? 分析: 浏览器之所以 ...

  3. ajax请求成功后打开新开窗口(window.open())被拦截的解决方法

    问题:今天在做项目时需要在ajax请求成功后打开一个新的窗口,此时遇到浏览拦截了新窗口的问题,尝试在ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('clic ...

  4. ajax请求 拦截窗口,ajax请求成功后新开窗口window.open()被拦截解决方法

    ajax请求成功后新开窗口window.open()被拦截解决方法 问题: 前面开发项目时碰到一个问题,ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但 ...

  5. html动态加载js方法,原生JS实现动态加载js文件并在加载成功后执行回调函数的方法...

    本文实例讲述了原生JS实现动态加载js文件并在加载成功后执行回调函数的方法.分享给大家供大家参考,具体如下: 有的时候需要动态加载一个javascript文件,并且在加载成功后执行回调函数(例如文件中 ...

  6. [转]在C#中使用API回调函数的方法

    在C#中使用API回调函数的方法 就以EnumChildWindows和EnumChildProc为例子: 首先要声明EnumChildProc 为一个回调函数 public delegate boo ...

  7. ES6----promise方法解决回调地狱问题

    ES6–promise方法解决回调地狱问题 要解决回调地狱问题,首先要了解回调地狱的产生是由于早期的javascript只支持回调函数来表现异步操作完成,由于业务逻辑复杂时,就会出现一个串联多个异步操 ...

  8. 完美解决三星手机拍照后横竖屏切换导致的回调为null以致程序崩溃的问题(包括三星note3的特殊适配)

    场景:安卓开发中我们经常会有拍照上传的需求,比如上传图片,或者上传头像等等,方法也比较常规,通过调用startActivityForResult(Intent intent, int requestC ...

  9. jQuery 发起 Ajax 请求最常用的三个方法

    浏览器中提供的 XMLHttpRequest 用法比较复杂,所以 jQuery 对 XMLHttpRequest 进行了封装,提供了一系列 Ajax 相关的函数,极大地降低了 Ajax 的使用难度. ...

最新文章

  1. vue中利用scss实现整体换肤和字体大小设置
  2. IDEA源码阅读利器 — UML类图插件Diagram
  3. [LUOGU] P2330 [SCOI2005]繁忙的都市
  4. 线程安全的理论讲解(volatile)
  5. php oracle count,调用Count列php mysql
  6. Mybatis-plus之RowBounds实现分页查询
  7. Go学习笔记—多线程
  8. mybatis mysql usegeneratedkeys_mybatis中useGeneratedKeys用法--插入数据库后获取主键值
  9. SP10707 COT2 - Count on a tree II
  10. python *args用法_python函数参数*args**kwargs用法实例
  11. SpringBoot和监控管理
  12. 测试面试题集-逻辑推理题
  13. 【bzoj1758】[Wc2010]重建计划
  14. Android NuPlayer播放框架
  15. CentOS8下安装wget、wget2
  16. Python版的BS期权定价模型和希腊值分析
  17. 武林传奇之七剑下天山java游戏开发商_武林传奇之七剑下天山
  18. 解决打开word时显示microsoft visual basic运行时错误没有注册类的问题
  19. 敲开bp神经网络之门(三,机器视觉斑点blob匹配中使用)
  20. PVE下虚拟机安装UNRAID

热门文章

  1. ajax和map返回数据类型,ajax请求后台返回map类型并如何展示
  2. suse oracle 12c安装,用半行代码实现在LINUX(SUSE/RH)下安装ORACLE 12C
  3. Java案例——统计字符串中每个字符串出现的次数
  4. 图的最短路径dijkstra算法
  5. iOS 解决app退出后台应用重新启动的问题
  6. WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口
  7. 虚拟货币市值回调到4100亿整数关口,EOS逆势站上100关口
  8. Dotfuscator代码混淆工具的使用
  9. 论Oracle 11g数据库备份与恢复策略
  10. MySQL 用户与授权管理详解