retainCounts计数是OC对象引用计数器
- alloc为对象分配内存,retainCount 为1 。
- retain :MRC下释放旧的对象,将旧对象的值赋给输入对象,再把输入对象的引用计数+1. 常常用于NSObject和其子类。需要对变量release,再retain新值。此属性只能用于OC对象类型,而不能用于Core Foundation
- copy 一个对象变成新的对象,retainCount为 1, 原有的对象计数不变。
- release 对象的引用计数 -1。
- autorelease 对象的引用计数 retainCount - 1,如果为0,等到最近一个pool结束时释放。
- 不管MRC还是ARC,其实都是看reference count是否为0,如果为0那么该对象就被释放,不同的地方是MRC需要程序员自己主动去添加retain 和 release,而ARC 会自动的在合适的地方插入retain 和 release类似的内存管理代码
MRC下assign和retain的区别:assign只是简单的赋值操 作,它引用的对象被释放,会造成野指针,可能出现crash情况;retain会使对象的retainCount计数加1,获得对象的拥有权,只有对象的引用计数为0的时候才会被释放,避免访问一个被释放的对象。
copy和retain的区别:如:一个NSString对象,内存地址为:0x1111,内容为@“Hello”。
- copy是创建一个新对象。retain是创建一个指针,引用计数+1
- copy到另外一个NSString后,地址为0x2222,内容相同(新建一个内容,内容拷贝),新的对象引用计数为1,旧的对象没有改变。
- retain到另外一个NSString后,地址相同(新建一个指针,指针拷贝),内容相同,对象的引用计数+1.
Strong 和weak
-
strong表示对对象的强引用,对象的引用计数retainCount + 1。
-
ARC下也可以用来修饰block,strong 和 weak两个修饰符默认是strong。
-
用于指针变量,setter方法对参数进行release旧值再retain新值。
-
weak 表示对对象的弱引用,被weak修饰的对象随时可被系统销毁和回收。
-
weak比较常用的地方就是delegate属性的设置。
-
用weak修饰弱引用,不会使传入对象的引用计数retainCount 加1
assign和weak的区别:当它们指向的对象释放以后,weak会被自动设置为nil,而assign不会,所以会导致野指针的出现,可能会导致crashstrong和weak的区别:
-
strong :表明是一个强引用,相当于MRC下的retain,只要被strong引用的对象就不会被销毁,当所有的强引用消除时,对象的引用计数为0时,对象才会被销毁。
-
weak : 表明是一个弱引用,相当于MRC下的assign,不会使对象的引用计数+1。
-
两个不同对象相互strong引用对象,会导致循环引用造成对象不能释放,造成内存泄漏。
readwrite 和readonly
-
当我们用readwrite修饰的时候表示该属性可读可改,用readonly修饰的时候表示这个属性只可以读取,不可以修改,一般常用在我们不希望外界改变只希望外界读取这种情况。
-
readwrite 程序自动创建setter/getter方法,readonly 程序创建getter方法。此外还可以自定义setter/getter方法。
-
系统默认的情况就是 readwrite。
atomic/nonatomic
- atomic[默认属性]:OC使用的一种线程保护技术,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以如果没有使用多线程间的通讯编程,选择使用nonatomic。
- nonatomic:非原子性访问,属性赋值的时候不加锁,多线程并发访问会提高性能。但可能会造成不安全,如果不加该属性,则默认setter/getter两个方法都是原子性事务访问所以,atomic和nonatomic用来决定编译器生成的getter,setter是否为原子操作。
拥有者权限:
ARC的支持条件之一:必须是可保留对象指针(ROP)
还有不可保留对象指针(non-ROP)指针的所有权会移交
如:NSString *theString = @“Learn Objective-C”;(ROP)
CFStringRef cfString = (CFStringRef)theString;(non-ROP)
- (_bridge)类型操作符:这种类型的转换会传递指针但不会传递它的所有权 cfString = (_bridge CFStringRef) theString; cfString 接受了指令,但指针的所有权仍然为theString保留
- (_bridge_retained)类型操作符:使用这种类型会把所有权转移到non-ROP上。 cfString = (_bridge_retained CFStringRef) theString; cfString 拥有了指针,并保留了它的保留计数器,需要用retain和release管理内存
- (_bridge-transfer)类型操作符:这种转换类型是所有权交给ROP
异常处理:
OC所有的异常必须是NSExpection类型的异常,所有的关键字必须使用@开头
- @try:定义用来测试的代码块一决定是否抛出异常。
- @catch( ):定义用来处理已抛出的异常的代码块,接受的参数通常是NSException类型或其子类型
- @finally:定义无论是否有异常抛出都会执行的代码块
- @throw:抛出异常信息