iOS中判定delegate是否已经被释放掉
来源:互联网 发布:怎么执行mysql数据库 编辑:程序博客网 时间:2024/05/18 01:07
在iOS的实际开发过程中,常常会遇到内存管理的问题。有一种特别常见的内存管理问题是delegate释放引起的,这种问题是最难发现,也是最难修复的。下面介绍一下这种问题的简单解决办法。(亲测可用!)
首先说一下原理,由于某个对象release之后(在不方便置为nil时,比如UIViewController作为delegate),其指针仍不为空,还占有内存地址,因此不能直接用类似delegate == nil的判定方法,而且这是给该delegate发送任何消息,程序都会在此处crash。
再来详说解决办法,其实这里用到了一个技巧。主要思路是,delegate被释放之后,其占有内存地址,其值也是内存地址,而不是某个具体的对象。因此,可以重载delegate的赋值操作,在该操作里面记下该delegate的类的类型,然后在使用delegate的地方,检测当前的delegate是否与之前记下的delegate是同一个类型,如果是,则说明该delegate没有被释放,如果不是,那说明被释放了,那就别发起回调了。
示例代码:
注意,要引用 #import "objc/runtime.h"头文件
AClass.h
@protocol TestDelegate <NSObject>
- (void)delegateMethod;
@end
@interface Aclass : NSObject
{
Class _orignalCls;
id<TestDelegate> _delegate;
}
@property (nonatomic, asssign) id<TestDelegate> delegate;
@end;
AClass.m
- (id)init
{
self = [super init];
if(self){
///////
}
return self;
}
- (void)setDelegate:(id<TestDelegate>)delegate{
_delegate = delegate;
_orignalCls = object_getClass(delegate);/**这是关键*/
}
//回调函数
- (void)callbackInvoke{
if(self.delegate){
Class currentCls = object_getClass(self.delegate);
if(currentCls == _orignalCls){
//delegate没有释放发起回调
if(self.delegate respondsToSelector(delegateMethod)){
[self.delegate delegateMethod];
}
}
}
}
@end
后记:因为object_getClass()是动态编译的,在程序运行时能够准确的得到当前指针所指向的对象内容,所以这几乎是得到delegate类类型的唯一办法。
如果有其他的方法,请各位指出来,互相学习一下。谢谢!
- iOS中判定delegate是否已经被释放掉
- iOS开发之回调delegate的方法时判断delegate是否已经被释放
- iOS开发之回调delegate的方法时判断delegate是否已经被释放
- iOS开发之回调delegate的方法时判断delegate是否已经被释放
- iOS开发之回调delegate的方法时判断delegate是否已经被释放
- 再谈Cocoa中回调delegate的方法时判断delegate是否已经被释放
- Cocoa中回调delegate的方法时判断delegate是否已经被释放
- [iOS开发技巧之]Delegate 是否已释放
- 关于用户是否已经登录的判定
- VB 判定程序是否已经结束
- Struts2中用拦截器判定是否已经登录
- iOS中判定某点是否在不规则多边形中的解决方案
- IOS中delegate的使用方法
- ios中@protocol和@delegate
- linux中判定远程目录是否存在
- 判定数组中是否存在重复元素
- iOS判断某个类是否释放
- 数字是否在枚举中已经被定义
- 昔我往矣,杨柳依依
- 读取excel大于Z列的数据
- 夏
- Vim 复制粘帖格
- char、varchar、nchar、nvarchar的区别(MSSQL)
- iOS中判定delegate是否已经被释放掉
- iOS集成支付宝SDK支付功能
- 九月的天气是忧郁的,是伤感的,是充满离别的
- 全球97%智能手机采用美国造操作系统
- linux log
- 将Unity3D游戏移植到Android平台上
- 加在self.tabbarcontroller.view上的屏保页面拖动效果实现
- C++构造函数、拷贝构造函数、赋值运算符漫谈(二)——函数返回值
- 在 VMware ESXi 上安装 Minix