iOS -- 开发技巧(四)

来源:互联网 发布:如何用网络挣钱 编辑:程序博客网 时间:2024/06/08 19:39

一、重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?

从定义上来说:

重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

重写:是指子类重新定义复类虚函数的方法。

从实现原理上来说:

重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!

重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。不能重写标志为final,static的方法 。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。


二、多态的作用?

多态: 面向对象的设计原则中有一条里氏代换原则:父类出现的地方,子类一定可以出现,反之则不一定;多态即是这一原则的具体表现形式,设有父类为A,含有方法g(),B1、B2、……、Bn是A类的子类,每个子类都以自己的方式实现了方法g(),当类A的对象向子类对象发出消息g()时,接收到此消息的各B子类对象将表现出不同的行为,这种现象即为多态。

作用:

1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;

2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

实现多态,有二种方式,覆盖(重写),重载。
•    覆盖(override),是指子类重新定义父类的虚函数的做法。
•    重载(overload),是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

总结:封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。


三、Objective-C的优点

Objective-C语言有C++ Java等面向对象的特点,那是远远不能体现它的优点的。Objective-C的优点是它是动态的。动态能力有三种:

动态类-运行时确定类的对象

动态绑定-运行时确定要调用的方法

动态加载--运行时为程序加载新的模块


Objective-C和Java C++一样,有封装,继承,多态,重用。但是它不像C++那样有重载操作法、模版和多继承,也没有Java的垃圾回收机制。

NSObject是大部分Objective-C类的根类,它没有父类。其它类继承NSObject,访问Objective-C运行时系统的基本接口,这样其他类的实例可以获得运行时的能力。

NSObject不但是个类名,NSObject也是个协议的名称,NSObject协议指定了根类必须实现的接口。   分配、初始化、和复制、对象的保持和清理等等


四、内存分配区

1)、栈区(stack由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2)、堆区(heap一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。alloc

3)、全局区(静态区)(static,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。-程序结束后有系统释放。注意:全局区又可分为未初始化全局区:.bss段和初始化全局区:data段。

4)、常量区常量字符串就是放在这里的。程序结束后由系统释放

5)、代码区存放函数体的二进制代码。


五、protocol和delegate分析

protocol定义一堆方法,你要去实现它们。
delegate是一种设计模式的使用。把自己的一些实现方法交给另外的类,就是委托给其他类。这个类就是你听到的delegate类。
有人会混淆:protocol也是要实现,delegate也是要实现,有啥区别啊,我晕了。
1、delegate是一个我们可以自定义的类,它实现了别的类委托的方法。
     protocol只是一个协议,语法定义的一堆方法,没有具体实现。
2、应该把delegate这个类去遵循某个xxxprotocol协议,xxxprotocol协议定义的是别的类需要委托的方法,委托协议。有了这个委托协议的类,才可以成为别的类的delegate类,(因为你这个类就一定要实现委托协议里面的方法了呀)!


六、在项目什么时候选择使用GCD,什么时候选择NSOperation?

NSOperation是建立在GCD之上的 虽然使用起来比较复杂 但是在线程并发管理 优先级 上有着GCD 无法比拟的优势

项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。NSOperation是建立在GCD之上的 虽然使用起来比较复杂 但是在线程并发管理 优先级 上有着GCD 无法比拟的优势
项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。GCD在多核CPU上线程切换的时间比较短 效率相对高些


七、项目中runtime的使用

利用runtime:JSON解析之后赋值给对象属性

unsigned int outCount, i;

    objc_property_t *properties = class_copyPropertyList([self class], &outCount);

    for (i=0; i<outCount; i++) {

        objc_property_t property = properties[i];

        NSString *key = [[NSString alloc]initWithCString:property_getName(property)  encoding:NSUTF8StringEncoding];

        NSString *selectorStr = [NSString stringWithFormat:@"set%@%@:",[[key substringToIndex:1] uppercaseString], [key substringFromIndex:1]];

        

        id obj = nil;

        if ([dic objectForKey:key] != nil) {

            if (![[dic objectForKey:key] isEqual:[NSNull null]]) {

                obj = [dic objectForKey:key];

            }

        }

        

       [self performSelector:NSSelectorFromString(selectorStr) withObject:obj];

    }

自己项目中xml解析也用到了,详细见**帮3.1之前版本

0 0