当用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)。