2018-01-17 OC基础概念
OC的理解与特性
OC 作为一门面向对象的语言, 自然具有面向对象的语言特性: 封装 继承 多态.
它既具有静态语言特性(C++),又有动态语言效率(动态绑定,动态加载). 总体来讲,OC确实是一门不错的编程语言,
objective-C具有相当多的动态特性,表现为三方面: 动态类型(Dynamic typing),动态绑定(Dynamic binding) 和动态加载 (Dynanic loading) , 动态--必须到运行时(run time) 才会做的一些事情.
动态类型:
运行时才会决定对象的类型, 这种动态特性在日常应用中非常常见 , 简单来说是id类型.事实上由于静态类型的固定性和可预知性,从而使用的更加广泛. 静态类型是强类型,而动态类型属于弱类型,运行时决定接收者 .
动态绑定:
基于动态类型 , 在某个实例对象被确定后, 其类型便被确定了,该对象对应的属性和响应消息也被完全确定.
动态加载:
根据需求加载所需要的资源, 最基本的就是不同机型的适配,例如:在Retina设备上加载@2x的图片, 而在老一些的普通苹果设备上加载原图,让程序在运行时添加代码模块以及其他资源, 用户可根据需要加载一些可执行代码和资源,而不是在启动时就加在所有组件,可执行代码可以含有和程序运行时整合的新类.
简述内存管理的基本原则
之前 OC内存管理遵循"水创建 谁释放 , 谁引用谁管理"的机制,当创建或者引用一个对象的时候,需要向他发送alloc copy retain消息,当释放该对象时需要发送release消息,当对象引用计数为0时,系统将释放该对象,这是##OC的手动管理机制.MRC
iOS5.0之后引用"自动管理机制" --自动引用计数 ARC , 管理机制与手动机制一样,知识不在需要调用retain release autorelease
; 它编译时特性:当你使用ARC时,在适当位置插入release和autorelease;它引用strong和weak 关键字,strong修饰的指针变量指向对象时,当指针指向新值或者指针不存在时weak修饰的指针会自动为nil .
如果使用alloc copy(mutableCopy )
或者retain一个对象时,你就有义务,向他发送一条release
或者autorelease
消息. 其他方法创建的对象,不需要由你来管理内存.
其他注意事项
如果一个对象有一个_strong类型的指针指向着,这个对象就不会被释放.如果一个指针指向超出了它的作用域,就会被指向nil. 如果一个指针被指向nil,那么它原来指向的对象就会被释放.
当一个视图控制器被释放时,它内部全局指针会被指向nil . 用法:"不管全局变量还是局部变量用_strong描述就行"
连线的时候用weak描述
代理使用 unsafe_unretained就相当于assign;
block 中为了避免循环引用问题, 使用_weak描述;
声明属性时,不要以new开头. 如果非要以new开头命名属性的名字 , 需要自己制定get方法名.
ARC只能管理Foundation框架的变量, 如果程序中把Foundation中的变量强制转换成Core Foundation 中的变量需要交换管理权;
在非ARC工程中采用ARC编译某些类 : -fobjc -arc;
在ARC工程中采用非ARC去编译某些类:-fno-fobjc-arc.