Objective--C 一 关键字 1 KVC 动态设值,动态取值,类似雨java中的反射,而且私有的照样可以设置与获取 2 二 函数 1 retain 给对象引用计数器 + 1 2 release 给对象引用计数器 - 1 3 dealloc 销毁对象,当对象引起计数器为O时,自动调用该方法, 4 autorelease 延迟释放对象 5 setValue:forkey 设置对象属性值(简单) 6 setvalue :forkeyPath 设置对象属性值(复杂) 7 valueForKey: 获取对象属性值 (简单) 8 valueForKeyPath 获取对象属性值(复杂) 9 floatValue 字符串转flaot类型 10 intValue 字符串转NSInteger类型 三 规则 1 引用计数器 A 对象内存管理 B 在OC中没有垃圾自动回收机制,所以需要手动回收,所以用到了这个规则,其实在ObjC中内存的管理是依赖对象引用计数器来进行的:在ObjC中每个对象内部都有一个与之对应的整数(retainCount),叫“引用计数器”,当一个对象在创建之后它的引用计数器为1,当调用这个对象的alloc、retain、new、copy方法之后引用计数器自动在原来的基础上加1(ObjC中调用一个对象的方法就是给这个对象发送一个消息),当调用这个对象的release方法之后它的引用计数器减1,如果一个对象的引用计数器为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象。 C 内存释放的原则 谁创建,谁释放 D 关闭项目ARC 项目属性—Build Settings--搜索“garbage”找到Objective-C Automatic Reference Counting设置为No即可。 2 自动释放池 A 在ObjC中也有一种内存自动释放的机制叫做“自动引用计数”(或“自动释放池”),与C#、Java不同的是,这只是一种半自动的机制,有些操作还是需要我们手动设置的。自动内存释放使用@autoreleasepool 关键字声明一个代码块,如果一个对象在初始化时调用了autorelase方法,那么当代码块执行完之后,在块中调用过autorelease方法的对象都会自动调用一次release方法。这样一来就起到了自动释放的作用,同时对象的销毁过程也得到了延迟(统一调用release方法) B autorelease方法不会改变对象的引用计数器,只是将这个对象放到自动释放池中; C 自动释放池实质是当自动释放池销毁后调用对象的release方法,不一定就能销毁对象(例如如果一个对象的引用计数器>1则此时就无法销毁); D 由于自动释放池最后统一销毁对象,因此如果一个操作比较占用内存(对象比较多或者对象占用资源比较多),最好不要放到自动释放池或者考虑放到多个自动释放池; E ObjC中类库中的静态方法一般都不需要手动释放,内部已经调用了autorelease方法; 3 键值编码KVC A KVC的操作方法由NSKeyValueCoding协议提供,而NSObject就实现了这个协议,也就是说ObjC中几乎所有的对象都支持KVC操作 B 动态设置: setValue:属性值 forKey:属性名(用于简单路径)、setValue:属性值 forKeyPath:属性路径(用于复合路径, 例如Person有一个Account类型的属性,那么person.account就是一个复合属性) C 动态读取: valueForKey:属性名 、vamlueForKeyPath:属性名(用于复合路径) D KVC使用起来比较简单,但是它如何查找一个属性进行读取呢?具体查找规则(假设现在要利用KVC对a进行读取): I 如果是动态设置属性,则优先考虑调用setA方法,如果没有该方法则优先考虑搜索成员变量_a,如果仍然不存在则搜索成员变量a, 如果最后仍然没搜索到则会调用这个类的setValue:forUndefinedKey:方法(注意搜索过程中不管这些方法、成员变量是私有的还是公共的都能正确设置); I 如果是动态读取属性,则优先考虑调用a方法(属性a的getter方法),如果没有搜索到则会优先搜索成员变量_a,如果仍然不存在则搜索成员变量a, 如果最后仍然没搜索到则会调用这个类的valueforUndefinedKey:方法(注意搜索过程中不管这些方法、成员变量是私有的还是公共的都能正确读取); I E 无论对象的成员变量是私有还是公有,同样可以动态设置,动态取值
时间: 2024-11-02 20:28:40