OC 的那点事儿

来源:互联网 发布:java垃圾回收方法 编辑:程序博客网 时间:2024/05/17 04:04

三、OC 语言的特点:
OC是C语言的一个超集,是C的基础上增加了一个面向对象(OO)的特性;
OC和java都是单继承,C++是多继承;
OC不支持命名空间机制,取而代之的是类名前面加前缀,以此来区分;

面向过程的语言 :都是祈使句,直接和CPU沟通。目的是操作CPU,储存数据,管理数据。


面向对象的语言:在程序中,添加能够接收消息的单元(对象),每个单元拥有自己的功能,各单元合作,完成程序。
面向对象没有具体的官方定义。早期只使用继承、封装、多态编写程序的思想。后来,主要指将生活逻辑映射到程序当中。

一、OC 中常见的用来修饰属性的几个关键字:assign &weak, retain &strong, copy ,nonatomic
   assign:(MRC中)修饰基本数据类型(如:数值类型)
    retain:  (MRC中)保留计数,引用计数 “+1”, 获得对象所有权

    weak:   (ARC中)普通赋值可视为相当于MRC中的assign
    strong: (ARC中)强引用可视为相当于MRC中的retain(告知编译器在合适的地方自动插入retain)

    copy: 复制对象(常修饰字符串),Fundation中的不可变对象使用copy相当于retain
 
    _unsafe , _unretained,与weak功能一直,区别在于对象销毁后,weak会将变量设置为nil, 防止野指针调用。

注:
     nonatomic:非原子性访问,不加同步(多线程并发访问会提高性能)

其他:

由于delegate的非拥有特性,ARC中首选 weak  (weak 和 assign 区别)

因为:weak属性在释放的时候会自动将指针置为nil。而assign不会需要程序员自己手动置空。


内存释放后将指针置空一种推荐的安全做法。因为object c中可以用 nil为对象访问任意属性和方法。如[nil setProperty:someProperty]。但实际nil显然没有这个方法。但是程序实际什么都没做,却不会crash。但是如果一个已经被释 放了内存的非空属性调用任意方法会造成程序crash。


二、OC 中的 NULL,nil,Nil,NSNull

【如题】表示空的事物有四个
【NULL】【nil】【Nil】【NSNull】

NULL:表示基础类型指针为空
int * p = NULL;

nil:表示对象指针为空
id obj = nil;

Nil:表示Class变量为空
Class class = Nil;

NSNull:用在数组字典等数据结构中占位,作为空元素

空的方法(唯一的一个)
[NSNull null]; 创建表示空的对象



 四、#include,#import,@class
#include,#import效果相同,#import可以确保头文件只会被导入以此防止交叉编译;
#import的导入会包含这个类的全部信息,编译效率高,防止相互包含的编译错误 而@class声明名称是类的名称,不考虑类的具体实现,

五、类别和继承
类别:不通过增加子类而增加现有类的方法,增加的方法与原始方法几乎没区别;
        类别不能增加实例变量;
            类别覆盖原始方法后,原始方法不再调用;
继承:


六、内存管理
alloc、copy (mutableCopy)、retain 创建对象后 , 就要用release或者autorelease 释放对象,
其他方法创建对象不需要自己管理内存;
当我们释放对象是调用[super dealloc]方法是因为:子类有些对象是集成父类的,要把父类持有的对象释放

自动释放池的工作:自动释放池是一个NSAutorelease类的一个对象,当一个对象autorelease后,会被自动入池,待池销毁后,将会给池中所有对象进行release;

dealloc中 self.xxx = nil 先调用了  release 方法,还将变量设置为nil , 比直接 release 好。
七、ARC 和 GC
ARC 是Automatic Reference Counting 自动引用计数简称,iOS 5之后内存管理特性。本质还是使用引用计数来管理对象的,只是不需要手动实现release 、autorelease、delloc 方法,编译器会在合适的位置自动生成。
GC 是 garbage collection,内存管理垃圾回收机制,性能没有ARC的好;
iOS 开发有MRC和ARC,mac开发支持GC垃圾回收机制,10.8 废弃了GC改用ARC;
ARC中如果管理不当也会内存泄漏:
如:循环引用,OC和 CoreFoundation类之间的桥接管理不当;
八、堆 和 栈
栈(stack)由编译器分配和释放的,存放参数和局部变量;
堆(heap)由程序员分配和释放的,程序员不释放,内存溢出;
九、深拷贝 和 浅拷贝
浅拷贝:只复制对象本身,不对里面是属性复制
深拷贝:既复制对象,又复制里面的属性

十、KVC 和 KVO
KVC (键值编码)简洁访问对象的实例变量,不通过存取方法可以访问对象的实例变量
KVO (键值观察)获取对象属性变化的通知机制。
要用KVO观察到变化,对象必须采用KVC赋值。KVO建立在KVC基础上的;


十一、线程 进程
一般程序是单个进程,进程是个静态的容器,里面容纳了多个线程,线程是一系列方法的执行路径

十二、代理 block 通知
delegate 和block 用于 1对1 之间的通信
delegate 要定义协议方法,对象实现协议方法,建立了代理关系后才能通信;
block 更加紧凑简洁,不需要繁琐的协议方法,但是通信事件比较多的时候,建议用delegate,block传值为空,可能会发生崩溃。
notification 用于 1对多的 通信但是代码可读性要差一些





0 0