区别assign VS weak,__block VS __weak

在objective-c中,类中的全局变量经常使用如下的方式申明。

@property(nonatomic(1),strong(2))UIImageView *imageView;

其中的1,2处是对此变量的一些属性申明。有以下几种
strong
weak
assign
strong 和 weak 是在arc后引入的关键字,strong类似于retain,引用时候会引用计算+1,weak相反,不会改变引用计数。
weak和assign都是引用计算不变,两个的差别在于,weak用于object type,就是指针类型,而assign用于简单的数据类型,如int BOOL 等。
assign看起来跟weak一样,其实不能混用的,assign的变量在释放后并不设置为nil(和weak不同),当你再去引用时候就会发生错误,崩溃,EXC_BAD_ACCESS.

block 不能修改局部变量,如果需要修改需要加上block.
block 会对对象强引用,引起retain-cycle,需要使用
weak

__weak __typeof(&*self)weakSelf =self;

在block种使用weakSelf可避免这种强引用。
(两个指针,指向同一块地址(self));

starain Dou 豆电雨

原文链接:http://www.jianshu.com/p/ba49997e29c5

时间: 2025-01-03 13:57:14

区别assign VS weak,__block VS __weak的相关文章

请解释以下keywords的区别: assign vs weak, __block vs __weak

assign vs weak, __block vs __weak 字数364 阅读74 评论0 喜欢0 在objective-c中,类中的全局变量经常使用如下的方式申明. @property(nonatomic(1),strong(2))UIImageView *imageView; 其中的1,2处是对此变量的一些属性申明.有以下几种strong weakassignstrong 和 weak 是在arc后引入的关键字,strong类似于retain,引用时候会引用计算+1,weak相反,不会

__block和__weak的区别

API Reference对__block变量修饰符有如下几处解释: //A powerful feature of blocks is that they can modify variables in the same lexical scope. You signal that a block can modify a variable using the __block storage type modifier. //At function level are __block vari

__block 和__weak 区别及使用

API Reference对__block变量修饰符有如下几处解释: //A powerful feature of blocks is that they can modify variables in the same lexical scope. You signal that a block can modify a variable using the __block storage type modifier. //At function level are __block vari

iOS中修饰符assign与weak的区别

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

iOS中copy,retain,strong,assign,weak的区别以及使用

使用assign: 对基础数据类型 (NSInteger)和C数据类型(int, float, double, char,等)使用copy: 对NSString使用retain: 对其他NSObject和其子类 assign就是简单的赋值,不更改引用计数,所以直接使用基础数据 copy是直接拷贝内容,成为一个新的对象. retain释放旧的对象,将旧对象的值赋给新的对象,并使新的对象的引用计数加1 retain是指针拷贝 copy是分配新的内存属于内容拷贝,在拷贝之前都会释放旧的对象 在ARC中

(iOS) __block和__weak认识

果然还是对最基础的知识了解不透彻,今天看一看iOS中的两个修饰符:__block和__weak .也是做一下温习吧. 1.先说weak,<弱引用> 我们知道weak的使用,比如声明一个控件属性,就会用到weak. 看代码: @property(nonatomic,weak)UILabel *label; 当然这并不是说声明控件就一定使用weak,相反的我在手动创建控件是大多数会使用strong.但如果你比较细心的话,你会发现我们使用xib时,使用的却是weak这一属性.那问题来了,我们使用st

iOS __block 与 __weak

关于__block 与__weak http://stackoverflow.com/questions/19227982/using-block-and-weak 一下是一些区别的介绍 MRC: __block 能够使访问的变量能够在block中的修改生效,__block能够避免retain cycle. ARC:__block可能会造成retain cycle. 此时如果对原子类型(primitive)的数据如果不用__block修饰的话系统会自动在编译的时候报错的.

assign, retain, weak, strong, copy,unsafe_unretain

readonly, readwrite:是控制属性的访问权限,readonly只生成getter方法,其他类是无法修改其值的.readwrite是会同时生成getter和setter方法,其他类可以修改其值. assign, retain, weak, strong, copy,unsafe_unretained:在non-ARC中,assign和retain是一组,assign的对象属性引用计数不变,而retain会被+1.对应的在ARC中,weak和strong是一组,weak的对象属性引用

retain和strong、assign和weak的区别

IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样. (一般情况下: 后面会讨论例外情况) alloc 对象分配后引用计数为1 retain 对象的引用计数+1 copy copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变 release 对象引用计数-1 如果为0释放内存 autorelease 对象引用计数-1 如果为0不马上释