对于一个严谨的程序员来说,内存管理和多线程显得异常重要。在手机内存有限的情况下,对内存的管理要求更高,不再使用的内存空间如果不能得到及时释放,会让程序运行的内存迅速递增,内存使用爆表而被系统干掉,造成程序闪退;如果出现野指针,则会直接让程序崩溃。这些对于程序来说都是非常致命的。如果对多线程把握不好,不能处理死锁和线程依赖,则因为多线程的线程安全导致的Bug是很难解决的。
今天简单聊一下关于OC中的property和内存管理。
在前几年,当时iOS开发都在使用MRC模式,即手动管理内存。OC有自己独特的内存管理机制,即引用计数,简单的说,在new、copy、retain等的时候,相应的引用计数会+1,在release、autorelease的时候相应的引用计数会-1,根据引用计数来判断何时需要将其释放。在OC中,nil是一个很神奇的东东,nil对象可以调用任何方法而不崩溃,所以经常遇到一种情况就是在对一个对象release将其释放的时候,要对其来一次赋nil操作。
随着iOS开发技术的逐渐强大,苹果开始推荐使用一种新的内存管理模式,即ARC,也就是说自动引用计数管理,从而减少了程序员浪费在内存管理上的精力。当然,ARC的基本原理还是根据对象的引用计数管理内存,但基本不用程序员纠结内存管理的问题。从ARC流行之后,很多老的项目或者开源工具不再那么好维护,尤其是一些当时非常火的第三方框架。所以在第三方框架的选择时,一定要慎重考虑。虽然苹果也提供了MRC转ARC的方法,但是对于比较大的项目,修改起来还是非常费劲的。对于一些MRC的第三方框架来说,如果只是用一些比较简单的方法,可以直接在项目的属性里面标注其为MRC。还有一点需要注意的是,MRC模式在遇到内存管理的问题时很方便查找问题的原因,而ARC模式下就显得有点困难了。
下面说一下几乎天天在用的一块知识点:property。
学过c/c++的朋友都知道,我们定义struct/class的时候,如果把访问限定符(public,protected,private)设置为public的话,那么我们是可以直接用.号来访问它内部的数据成员的。而@prperty只不过是给编译器看的一种指令,它可以编译之后为你生成相应的getter和setter方法,从而允许你使用.语法,但是这里的点语法和C/C++中的还有一些区别。@property并不只是可以生成getter和setter方法,它还可以做内存管理。对于大部分程序员来说,知识点在没有完全吃透之前,总是不敢下手使用,那接下来就往更深处挖一下。
在使用@property的时候,经常用到一些关键字,包括:readwrite、readonly、assign、copy、retain、atomicity、nonatomic、weak、strong等,这些关键字主要和生成的getter/setter方法有关。
@property的参数主要分为三类:读写属性(readwrite/readonly);setter属性(assign/retain/copy,还有arc下的weak/strong);原子属性(atomicity/nonatomic)
各参数的意义如下:
readwrite:默认类型,产生setter/getter方法,即会自动生成存取器
readonly:只产生简单的getter,没有setter
assign:默认类型,setter方法肢解赋值,而不进行retain操作,一般处理基础类型,如int、float
retain:setter方法对参数进行release旧值,再retain新值
copy:setter方法进行copy操作,与retain一样,相当于在内存中新生成了该对象的副本,对副本操作不改变成员变量
weak:跟assign类似,只是在release时多了一次赋nil操作
strong:跟retain一样
nonatomic:禁止多线程,大量减少了自动生成一些互斥枷锁代码,变量保护,提高性能
atomicity:多线程,保证线程安全(一般很少使用)
接下来,你就可以大胆使用@property了。