题记:要想把UI学好,首先要对OC有一个清楚的认识,因为UI的代码是在OC的基础上建立起来的.学了这么长时间的UI觉得很多OC前面的很多对于学习UI有很大的帮助和作用,尤其是在理解和运用方面.如:KVC,属性传值,手动管理内存,代理模式等等在UI中运用很多.
今天主要说一下关于内存管理方面的知识.
在讲解内存管理之前呢,先和大家探讨一下OC.
对OC的理解:
OC面向对象的变成的一种, 那么什么是面向对象的编程呢?很多人也就知道个大概,不知道如何形容和描述它.我认为呢,其实只要你打的代码多了,慢慢的你也就懂了.哈哈,觉得是不是有点太敷衍了....
面向对象: 我对面向的编程是这样理解的:面向对象,说白了也就是以对象为根本,对象要做什么,我们通过对象要达到怎样的目的,我们所说的对象是抽象的,万事万物都可以是对象,这里的对象是一个大范围的概念,比如:导演就是一个类,因为导演是一类人嘛,这里就不对类这个概念进行阐述.很容易理解. 那么做导演拍电影的王晶这个人就是一个对象.也就是说我们落实到一个特定的人头上而不是一个抽象的集合,那么它就是对象,对象是锁定一个特定的事物,而不是一个类群.
OC是面向对象的, C语言,C++等等都是面向过程的编程,那么二者的区别是什么呢?
面向对象和面向过程编程的区别:
面向对象:通过类来创建一个对象,然后再通过对象来进行你需要的操作最后达到你想的目的.
面向过程:直接根据你想要达到的目的进行编写相应的代码,也是达到你要的结果.
说这些概念可能还有些抽象,接下来我们来举一个生活中的实例:<<钟点工>>这个小品都看过吧.赵本山和宋丹丹的.里面就有一个过程,我们可以用这个小故事来区别一下面向对象和面向过程
要把大象装冰箱,请问总共分几步?
面向对象会这么做:
第一步:得到大象这个对象;
第二步:得到冰箱这个对象;
第三步:通过冰箱这个对象调用相应的方法去把冰箱门打开;
第四步:然后再写一个方法接下来把大象放到冰箱里;
第五步:再调用冰箱的方法把冰箱门关上;
面向对象就搞定了!
那么面向过程会怎么做呢?
面向过程会这么做:
可能会定义一些指针,创建一些函数,然后最后把大象放到冰箱里.(不详细解释)
个人觉得:面向过程顾名思义,注重过程,它是根据要达到的目的去想办法创建怎样的函数去达到目的.主要是注重这个大象放到冰箱里的过程,无论怎么做,只要放到里面就可以了,可以有多种办法. 面向对象呢就是要严格的定义好要做什么,给了我什么,哪个对象该做什么样的事情.步骤严谨而且有条理.很清晰.
总结面向对象的变成思想:
第一:分析对象所涉及的类;
第二:根据功能去定义相应的类;
第三:使用对象去调用方法,完成一系列的操作,达到想要的目的.
顺便提一下:面向对象的变成呢有三大特性:继承,封装,和多态.这个在以后会慢慢讲解.
接下来才是重点:IOS的内存管理
今天关于内存管理我们先学习一下它的原理和机制... 下一篇文章会详解:敬请期待哦~
内存管理在IOS中分为手动和自动管理,一般来说我们都是手动管理内存,不让系统帮我们管理内存,这样做为了防止内存内存出现问题.
先说说我们用的IPhone手机,手机有时候总是出现闪退,百分之九十以上都是因为内存问题....
所以呢我们学习IOS编程的时候一定要养成好的习惯,即alloc了就要release一下,或者autorelease.
内存问题主要分为两大部分:内存溢出 和 野指针异常
内存溢出:说白了就是超出手机内存上线了,在我们的应用程序里图片,音频,视频占用了很大的一部分内存空间,当它们一超出内存上线,那么就会出现闪退或者crash现象.
野指针异常:就是我们定义的对象没有及时的释放,当你再用的时候,有时候也能用,但是一旦野指针中的内存被别的应用占了,那么就会可能crash.这样的错误很常见.
内存管理机制简介:
为什么要说内存管理呢? 因为它非常重要,使我们开发应用十分重视也是十分担忧的.
在OC中是自带垃圾回收机制的,但是在iOS中没有,iOS有内存管理机制,也就相当于垃圾回收的功能.
内存管理的原理和机制:我们通过操作引用计数来管理内存,内存管理的最常用的操作引用计数的关键字是 " retain release 和 autorelease "
当你retain一个对象的时候,引用计数会加一
当你release一个对象的时候,应用计数会减一
autorelease有些不一样,它是在未来减一,就是这个方法执行完毕,才会减一,具体的还是要看你需不需要用到它.
还有就是,一般来说当你没有创建一个对象的时候,它的引用计数为0(NSSting除外) 当你alloc创建的时候,它的引用计数就为1了. 当你release释放的时候,它的引用计数变成0.然后就会走dealloc方法释放内存.此时对象才销毁. 即在iOS中内存不会自动销毁,当引用计数为0的时候,会走系统的dealloc方法进行内存销毁.此时内存才得到释放.
返回内存引用计数为一的关键字:alloc new copy 即当你使用这三个关键字创建对象的时候,他们返回的对象的内存的引用计数此时就为1
例如下面这样一段代码:
Car是一个类;
Car *myCar = [Car alloc] init]; 初始化一个Car类型的对象myCar. --------> 此时的引用计数 为1.
[myCar retain]; -------->此时的引用计数会加一,变成了2.
[myCar release] ------->此时的引用计数会减一,变成了1.
[myCar release] ------->此时的引用计数又会减一,变成0.
就像之前说的当引用计数变为0之后呢,系统会自动调用dealloc方法,销毁对象所占的内存.此时对象就不存在了.