A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 占晓 中级黑马   /  2016-9-15 01:01  /  1736 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

13.内存管理,内存管理的原则,野指针与僵尸对象,内存管理方法,自动释放池,ARC 与 MRC

            1\内存管理:就是对内存进行管理,涉及-->分配内存,清除内存
                    内存五大区域:
                        1>栈区:存储局部变量(当局部变量脱离其作用域内,就会释放)
                        2>堆区:程序员手动申请的空间(需要手动释放,不手动释放直到程序结束才会释放)
                        3>BSS段:未初始化的全局变量或者静态变量(当初始化后,就会被释放)
                        4>数据段/常量区/全局区/静态区/DATA段:已经初始化的全局变量或静态变量或常量(程序结束才会被释放)
                        5>代码段:存储二进制代码(程序结束释放)
                        所以----> "堆区中的OC对象,是我们要管理内存的范围"

            2\内存管理的原则
                    有加就有减:谁"创建(alloc,new)"谁"release"\谁"retain"谁"release"\一次"copy"对应一次"release"


            3\野指针与僵尸对象
                    1>野指针:指向僵尸对象(不可用内存)的指针.   (C语言中野指针:指向未知地址的指针)
                    2>僵尸对象:已经被销毁的对象(不能再使用的对象)

            4\内存管理方法
                    1>谁"创建(alloc,new)"谁"release"\谁"retain"谁"release"\一次"copy"对应一次"release"
                    2>setter方法中的内存管理 (如果旧对象不等于新对象---->旧对象release,新对象retain,  如果旧对象等于新对象,不做操作)
                    3>dealloc方法中的内存管理(当这个对象不在了,release这个对象拥有的其他对象)
                    4>循环包含问题:当出现A对象包含B对象,B对象包含A对象时,会导致A对象和B对象永远无法释放.
                    解决办法:MRC:一端用retain 一端用assign    ARC:一端用strong 一端用weak;
                    5>成员属性是字符串@property参数用"copy"

            5\自动释放池(@autoreleasepool)
                    1>在自动释放池内给对象发送一条autorelease消息,会将对象放到一个自动释放池内
                    2>当自动释放池被销毁的时候,会对池子里的所有对象做"一次"release操作.
                    3>好处:不用关心对象释放时间
                        不用再关心什么时候调用release
                    4>使用注意:占用内存较大的对象不要随便使用autorelease

            6\ARC 与 MRC
                    ARC:自动引用计数,编译器帮我们管理对象的retainCount值(自动管理内存)(Xcode6以后,新建项目默认是ARC)
                    MRC:手动引用计数,程序员需要手动管理对象的retainCount值(手动管理内存)---理解MRC才能更好理解内存管理的原理



#pragma mark - 14.分类,延展。

14.分类,延展。

            1\分类:category
                    1>当一个类包含了非常多的属于不同范畴的方法的时候,我们通常将这个类用多个文件来实现,其中有一个类叫主类,剩余的叫分类.
                    "一个类 == 这个类的所有类(主类+分类)"
                    2>注意:分类中不能写属性,只能写方法的声明和实现  即使使用了@property"只"会生成setter、getter的声明
                    3>分类中方法和本类的方法可以同名
                            优先调用分类的方法,如果多个分类同名,只会调用最后编译的那个分类中的方法.
                    4>使用场景:团队开发\一个类方法非常多,功能很复杂的时候
                    5>非正式协议:为"系统类"添加的分类

            2\延展:extension
                    1>一个特殊的分类:一个匿名的分类 ------ 在延展中可以有属性,但是只有方法的声明,而没有方法的实现(方法的实现在本类的.m文件中)
                    2>注意:可以有属性,可以有方法的声明,延展的实现在本类中,延展中可以使用@property,会有属性,也会有方法的声明和实现
                    3>使用:大部分 延展都会写在本类的.m文件中,而且是写到最上面
                                延展中写属性和方法,这些属性和方法都是私有化的成员



#pragma mark - 15.block,协议,协议与继承的区别,代理,

15.block,协议,协议与继承的区别,代理,

            1\block
                    1>是一个数据类型,它的变量可以存"一段符合要求的代码",用的时候最好用typedef简化block定义
                    2>跟C语言中指向函数的指针很类似
                    3>访问外部变量问题:1)block代码段内部可以定义和外部变量名字相同的变量
                                    2)在block代码段内部,可以访问外部的全局变量和局部变量的值
                                        可以修改全局变量的值,但是不能修改外部局部变量,如果非要修改外部局部变量的值,那么必须给外部这个局部变量前加上"_block修饰(访问时会将这个局部变量移动到堆区.)
                    ----->补充:copy  见下文深复制和浅复制


            2\协议@protocol
                    1>作用:专门用来写方法的"声明"
                    2>如果一个类想要一个协议中的所有方法的"声明", 只要让这个类遵守协议即可. ----类可以遵守"多份协议
                    3>协议中的方法的声明可以有两个修饰符:@required(默认) @optional
                            被@required修饰的方法 如果遵守的类中不实现,会警告************
                            被@optional修饰的方法 如果遵守的类中不实现,不会警告***************
                            @required和@optional 是用来程序员之间的沟通的

            3\协议与继承的区别
                    协议:一个类遵守这个协议,就可以拥有协议中所有方法的声明
                    继承:子类继承父类,就拥有所有父类中的所有的成员,方法
                    补充:    分类:将一个类分成多个模块,为类添加方法
                            延展(没有名字的分类):专门私有化类的成员

            4\代理

1 个回复

倒序浏览
感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马