属性约束
内存管理下的属性约束有:
1.线性安全相关(原子性操作)
atomic 原子操作(系统默认) 多线程
nonatomic 非原子操作:经常使用,提高程序执行效率
2.内存管理相关(通常在ARC下)
在MRC下:retain(强引用),copy(强引用),assign(弱引用,默认)通常在赋值时使用
3.读写属性
readWrite(同时生成set和get方法)(默认)
readOnly(只会生成get方法)
4.重命名相关
set方法重命名方法名称后必须附带一个冒号:
get方法重命名
Xcode调成MRC Xcode---->左上角蓝色手机----->Build setting---->搜gar---->改成NO
MRC下手动内存管理
内存管理通俗来讲就是:自己声明的对象就要管理它的创建和消失,如果创建不让它消失就会产生内存泄露,导致内存占有率提高,降低手机性能
手动内存管理(MRC,手动引用计数),retainCount(用来记录当前对象在内存中的数量),
只有当returnCount为0,对象没有dealloc方法被调用,对象才会被销毁
内存管理原则:
只要使用有alloc,new,copy,mutableCopy,retain的方法,将对象地址赋值给指针变量时,retainCount + 1
release或者autorelease会造成retainCount - 1
!哪个指针强引用这个地址,就由该指针去释放[对象名 release];自己管自己
深浅拷贝
1.深拷贝:重新拷贝一块内存空间,用来存放对象的拷贝,然后把新的指针赋值给新的指针变量
2.浅拷贝:对象地址的拷贝,不会生成新对象的内存空间
copy:
拷贝一个不可变对象是浅拷贝
拷贝一个可变对象是深拷贝
copy返回对象一定是不可变的
mutablecopy:
无论拷贝对象是可变还是不可变,最后都会进行深拷贝,而且拷贝出来的空间一定是可变的
mutablecopy可以把NSString *变成NSMutableString *
面试问题:字符串使用的是什么拷贝,为什么选择这个
字符串使用copy是为了防止外界的改变对对象本身属性产生影响,从而造成不可预期的错误
循环引用
对象之间都通过强指针进行相互引用后,就会造成循环引用,对象无法被销毁,造成内存泄露 解决方案:把其中一个对象的引用改为弱引用