【Objective_C】基础学习-内存管理

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不会,所以会导致野指针的出现,可能会导致crash

     strong和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:抛出异常信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值