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