在请求完成后回调delegate的方法。然而回调时经常遇到这种情况:delegate已经被释放...
最近的项目遇到了网络请求,需要在请求完成后回调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已经被释放...相关推荐
- 多个Ajax请求成功后再执行后续方法
经常会遇到需要ajax请求完毕后调用某方法,这次是多个ajax请求成功后,用它们返回的数据传参给回调方法,查询了一下,可以用jquery中的 $.when(),使用方法如下: $.when( $.aj ...
- 【jquery】ajax 请求成功后新开窗口被拦截解决方法
问题: 前面开发项目时碰到一个问题,ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是很可惜被浏览器给拦截了,怎么解决这个问题呢? 分析: 浏览器之所以 ...
- ajax请求成功后打开新开窗口(window.open())被拦截的解决方法
问题:今天在做项目时需要在ajax请求成功后打开一个新的窗口,此时遇到浏览拦截了新窗口的问题,尝试在ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('clic ...
- ajax请求 拦截窗口,ajax请求成功后新开窗口window.open()被拦截解决方法
ajax请求成功后新开窗口window.open()被拦截解决方法 问题: 前面开发项目时碰到一个问题,ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但 ...
- html动态加载js方法,原生JS实现动态加载js文件并在加载成功后执行回调函数的方法...
本文实例讲述了原生JS实现动态加载js文件并在加载成功后执行回调函数的方法.分享给大家供大家参考,具体如下: 有的时候需要动态加载一个javascript文件,并且在加载成功后执行回调函数(例如文件中 ...
- [转]在C#中使用API回调函数的方法
在C#中使用API回调函数的方法 就以EnumChildWindows和EnumChildProc为例子: 首先要声明EnumChildProc 为一个回调函数 public delegate boo ...
- ES6----promise方法解决回调地狱问题
ES6–promise方法解决回调地狱问题 要解决回调地狱问题,首先要了解回调地狱的产生是由于早期的javascript只支持回调函数来表现异步操作完成,由于业务逻辑复杂时,就会出现一个串联多个异步操 ...
- 完美解决三星手机拍照后横竖屏切换导致的回调为null以致程序崩溃的问题(包括三星note3的特殊适配)
场景:安卓开发中我们经常会有拍照上传的需求,比如上传图片,或者上传头像等等,方法也比较常规,通过调用startActivityForResult(Intent intent, int requestC ...
- jQuery 发起 Ajax 请求最常用的三个方法
浏览器中提供的 XMLHttpRequest 用法比较复杂,所以 jQuery 对 XMLHttpRequest 进行了封装,提供了一系列 Ajax 相关的函数,极大地降低了 Ajax 的使用难度. ...
最新文章
- vue中利用scss实现整体换肤和字体大小设置
- IDEA源码阅读利器 — UML类图插件Diagram
- [LUOGU] P2330 [SCOI2005]繁忙的都市
- 线程安全的理论讲解(volatile)
- php oracle count,调用Count列php mysql
- Mybatis-plus之RowBounds实现分页查询
- Go学习笔记—多线程
- mybatis mysql usegeneratedkeys_mybatis中useGeneratedKeys用法--插入数据库后获取主键值
- SP10707 COT2 - Count on a tree II
- python *args用法_python函数参数*args**kwargs用法实例
- SpringBoot和监控管理
- 测试面试题集-逻辑推理题
- 【bzoj1758】[Wc2010]重建计划
- Android NuPlayer播放框架
- CentOS8下安装wget、wget2
- Python版的BS期权定价模型和希腊值分析
- 武林传奇之七剑下天山java游戏开发商_武林传奇之七剑下天山
- 解决打开word时显示microsoft visual basic运行时错误没有注册类的问题
- 敲开bp神经网络之门(三,机器视觉斑点blob匹配中使用)
- PVE下虚拟机安装UNRAID
热门文章
- ajax和map返回数据类型,ajax请求后台返回map类型并如何展示
- suse oracle 12c安装,用半行代码实现在LINUX(SUSE/RH)下安装ORACLE 12C
- Java案例——统计字符串中每个字符串出现的次数
- 图的最短路径dijkstra算法
- iOS 解决app退出后台应用重新启动的问题
- WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口
- 虚拟货币市值回调到4100亿整数关口,EOS逆势站上100关口
- Dotfuscator代码混淆工具的使用
- 论Oracle 11g数据库备份与恢复策略
- MySQL 用户与授权管理详解