·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> IOS学习笔记2015-03-18

IOS学习笔记2015-03-18

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23
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 无论对象的成员变量是私有还是公有,同样可以动态设置,动态取值