美文网首页
OBjective-C的内存管理

OBjective-C的内存管理

作者: lichengjin | 来源:发表于2016-03-03 23:47 被阅读34次

    如果您通过分配和初始化(比如[[MyClass alloc] init])的方式来创建对象,您就拥有

    1.当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为1.当你不再使用该对象时,你要负责向该对象发送一条release或autorelease消息,这样,该对象将在使用寿命结束时被销毁。

    2.当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清理。如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它。

    3.如果你保留了某个对象,你需要(最终)释放或自动释放该对象,必须保持retain方法和release方法的使用次数相等。

    自动释放池是什么,如何工作

    当你向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域的其他对象可以向他发送消息。当程序执行到作用域结束的位置时,自动释放就会被释放,池中的所有对象也就被释放了。

    1.ojc-C是通过一种“referring counting”(引用计数)的方式来管理内存的,对象再分配内存(alloc)的时候引用计数为1,以后每当碰到有copy,retain的时候引用计数器都会加1,每当碰到release和autorelease的时候引用计数器就会减1,如果此对象的计数变为0,就会被系统销毁。

    2.NSautoreleasePool就是用来做引用计数的管理工作的,这个东西一般不用你管的。

    3.autorelease和release没什么区别,只是引用计数减1的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减1.

    readwrite,readonly,assign,retain,copy,nonatomic属性的作用

    @property是一个属性访问声明,括号内支持以下几个属性:

    1.getter = getterName,setter = setterName,设置setter与getter的方法名

    2.readwrite,readonly,设置可供访问级别

    3.assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题

    4.retain,setter方法对参数进行release旧值再retain新值,所以实现度是这个顺序

    5.copy,setter方法进行copy操作,与retain处理流程一样,先旧值release,再copy出新的对象,retain count为1。这是为了减少对上下文的依赖而引入的机制。

    copy是在你不希望a和b共享一块内存时会使用到。a和b各自有各自的内存

    类别的作用

    类别主要有3个作用:

    1.将类 的实现分散到多个文件或多个不同框架中。

    2.创建对私有方法的前向引用。

    3.向对象添加分正式协议。

    类别的局限性

    有两方面的局限性:

    1.无法向类中添加新的实例变量,类别没有位置容纳实例变量,

    2.名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代出事方法从而无法再使用初始方法。

    属性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在那种情况下用

    assign:指定setter方法用简单的赋值,这是默认操作。你可以对标量类型(如int)使用这个属性。你可以想象一个float,它不是一个对象,所以他不能retain、copy。

    retain:指定retain应该在后面的对象上调用,前一个发送一条release消息。你可以想象一个NSString实例,它是一个对象,而且你可能想要retain它。

    copy:指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。

    readonly:将只生成getter方法而不生成setter方法(getter方法没有get前缀)。

    readwrite:默认属性,将生成不带额外参数的getter和setter方法(setter方法只有一个参数)。

    atomic:对于对象的默认属性,就是setter/getter生成的方法是一个原子操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部渔具之前,另一个线程开始执行setter的情况,相关于方法头尾加了锁一样。

    nonatomic:不保证setter/getter的原子性,多线程情况下数据可能会有问题。

    相关文章

      网友评论

          本文标题:OBjective-C的内存管理

          本文链接:https://www.haomeiwen.com/subject/qakokttx.html