delegate assign weak应该用哪个,避免EXC_BAD_ACCESS

只考虑ARC环境:自己写的delegate,使用weak,不用assign。

weak和assign的区别,当指向的对象被释放掉之后,weak指针会自动置为nil。而assign指针会指向一个无效的地址。

在异步环境下,经常会遇到异步回调的时候调用delegate的回调方法,

[self.delegate callbackMethod],

如果delegate属性是assign,如果这个时候delegate指向的实例已经被销毁了,就会EXC_BAD_ACCESS,而weak属性是对nil发消息,不会crash。

由于系统库例如UITableView之类的的代理还是使用的assign属性,所以良好的编程习惯是,在代理实例析构的时候,将uitableview的代理设置为nil,这样可以解决crash问题。

MyUITableViewController

- (id)init {
self.tableView.delegate = self;
}
- (void)dealloc {
self.tableView.delegate = nil;
}
时间: 2024-10-19 12:03:52

delegate assign weak应该用哪个,避免EXC_BAD_ACCESS的相关文章

block 与delegate( weak/id)

下面我们来说说delegate为啥定义时要用weak修饰符,这个涉及到循环引用的问题.例如一个ViewController上通过强指针引用了一个tableview,tableview的datasource和delegate都必须是weak指针,因为viewController被他两指向,如果用strong的话,就会形成强引用循环.

iOS中修饰符assign与weak的区别

上次做项目的时候,因为将delegate声明成assign类型,导致了程序EXC_BAD_ACCESS异常.结果发现是assign与weak的最大区别 它们都是弱引用声明类型,最大的区别在那呢? 如果用weak声明的变量在栈中就会自动清空 如果用assign声明的变量在栈中可能不会自动赋值为nil,就会造成野指针错误!

转 iOS:ARC相关知识,assign/copy/retain/strong/weak/readyonly/readwrite/nonatomic/atomic

    自动引用计数 ARC不是垃圾回收,而是编译器自动插入代码来减少程序员的代码输入和失误.     同时比垃圾和效率要高,因为其不影响运行时间,相当于自己管理内存.     总是通过属性来管理实例变量(init/dealloc除外),在dealloc中释放所有属性. dealloc中会自动加入释放实例变量的代码,因此不必要手段增加释放实例变量的代码.不需要手动调用[super  dealloc]   不要调用retain,release,autorelease,编译器会自动插入相关代码. 注

strong、weak、copy、assign 在命名属性时候怎么用

一直都在疑惑属性定义中在什么情况下用strong.在什么情况下用weak? 总结大致如下: 1.weak 是用来修饰代理(delegate)和UI控件. 2.strong 是用来修饰除了代理(delegate).UI控件.字符串(NSString)以外的对象类型. 3.copy 是用来修饰字符串(NSString). 4.assign 是用来修饰基本数据类型(非对象类型),如:int.float.bool.menu等. 解析为何控件用weak. 如图(1)所示,第一个描述的是一个控制器上边有一个

ios中关键词weak,assign,copy.strong等的区别

虽然开发IOS好多年了.但是这几个关键词总是深深困扰着我.加上IOS开发从mRC到ARC的过渡,这些概念更为困扰我了. 先说weak与assign.weak只能修饰对象,不能修饰基本数据类型.而assign既可以修饰基本数据类型,也可以修饰对象.但一般用于修饰基本数据类型.因为当你用assgin修饰对象时候,如果你修饰的对象销毁,该指针的指向地址仍然存在.所以造成野指针.而这个野指针的内存在堆上,所以容易造成堆内存崩溃.而基本数据类型则存在于栈上,栈上内存系统会自动处理,不会造成野指针. Str

[iOS基础控件 - 6.12.3] @property属性 strong weak copy

A.概念 @property 的修饰词 strong: 强指针/强引用(iOS6及之前是retain) weak: 弱智真/弱引用(iOS6及之前是assign) 默认情况所有指针都是强指针 使用 "__weak" 修饰的指针是弱指针 ARC准则:只要没有强指针指向,对象就会被销毁 @property属性的用法 * weak(assign) :  代理\UI控件* strong(retain) : 其他对象(除代理\UI控件\字符串以外的对象)* copy : 字符串 * assign

IOS开发--循环引用问题,普通控件为什么用weak,代理为什么用weak,block内用到外面的东

所有的引用计数系统,都存在循环应用的问题. 例如下面的引用关系对象: a创建并引用到了对象b. 对象b创建并引用到了对象c. 对象c创建并引用到了对象b. 这时候b和c的引用计数分别是2和1.当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放.b不释放,c的引用计数就是1,c也不会被释放.从此,b和c永远留在内存中,造成内存浪费.这种情况,必须打断循环引用,通过其他规则来维护引用关系. 那么普通控件为什么要用weak: 如下图控制器中的Vie

swift 内存管理,WEAK 和 UNOWNED

因为 Playground 本身会持有所有声明在其中的东西,因此本节中的示例代码需要在 Xcode 项目环境中运行.在 Playground 中可能无法得到正确的结果. 不管在什么语言里,内存管理的内容都很重要,所以我打算花上比其他 tip 长一些的篇幅仔细地说说这块内容. Swift 是自动管理内存的,这也就是说,我们不再需要操心内存的申请和分配.当我们通过初始化创建一个对象时,Swift 会替我们管理和分配内存.而释放的原则遵循了自动引用计数 (ARC) 的规则:当一个对象没有引用的时候,其

IOS学习5-strong/weak/copy

strong.weak,copy的详解 对象使用strong,ui控件使用weak,字符串用copy 现在使用ARC,ARC判断准则:只要没有强指针指向对象中,找个对象就会被销毁. 1. Strong/weak 默认情况下下是强指针 Person *person = [[Person alloc] init]; 弱指针使用_weak修饰 对象使用strong,为了保证对象在属性也在. 如果:对象中有个属性是_weak类型,那么可能该属性指向的对象已经被销毁,而引发问题. 注意循环引用引发内存泄漏