assign retain copy strong weak 区别 + __weak __block 解析

当用copy时,set方法会先release旧值,再copy一个新的对象,reference count 为1(减少了对上下文的依赖);当用assign,直接赋值,无retain操作。当用retain,release旧值,retain新值;

一个NSString 对象,地址为0×1111 ,内容为@”STR”

Copy 到另外一个NSString 之后,地址为0×2222 ,内容相同,新的对象retain为1 ,旧有对象没有变化

retain 到另外一个NSString 之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1

也就是说,retain 是指针拷贝,copy 是内容拷贝。

strong与weak的区别

strong类似于retain,会将对象的引用计数器+1,分配内存地址。

weak类似于指针,只是单纯的指向某个地址,但是本身并未分配内存地址。当指向的地址被销毁时,该指针会自动nil。

__weak与__block的作用

1.__weak修饰的对象不增加引用计数,不能被重新赋值

例:__weakViewController*weakSelf =self;

要避免强引用到self的话,用__weak把self重新引用一下就行了

2.__block是用来修改block块中类中局部变量的值

__block int mutableValue =7;

int(^myBlock)(int) = ^(int num) {

num = mutableValue ++;

return num;//当用__block或__weak修饰类中某个局部变量时,num值才会被修改。

};

3.它们都可以解决循环引用问题

__weak与__block的运用环境

1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。

2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。

你可能感兴趣的:(assign retain copy strong weak 区别 + __weak __block 解析)