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\代理 |
|