OBjective-C的内存管理

如果您通过分配和初始化(比如[[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的原子性,多线程情况下数据可能会有问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 11,008评论 8 119
  • 内存管理是程序在运行时分配内存、使用内存,并在程序完成时释放内存的过程。在Objective-C中,也被看作是在众...
    蹲瓜阅读 8,443评论 1 8
  • 前言 呀!!再也不三心二意了,从今往后专心搞iOS!嗯!从大一开始就嚷嚷对iOS热爱的很,结果呢,就毕设写了个垃圾...
    兔子泽阅读 4,617评论 6 3
  • 窗口 wiondow窗口是管理并展示所有视图,所有的可视控件都在window上部署,一般情况下,一个应用程序只有一...
    PeterKock阅读 3,477评论 0 1
  • 1、窗体 1、常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。 ...
    Moment__格调阅读 10,059评论 0 11