objective-C读书笔记

来源:互联网 发布:painter软件介绍 编辑:程序博客网 时间:2024/05/29 14:40

                     读  书   笔   记

                                                                             ---------读《Objective-C基础教程》的点滴感悟

 

        由于腾讯广研创新班对IOS终端开发的迫切要求,而自己之前对于这个领域可以说是零接触,所以最近一段时间研究了一下《objective-C基础教程》这本教材,为了加深自己对objective-C语言的了解与今后的熟练运用,我来回把整本书研究了两遍,确实有不少个人的感悟。首先,从整体上来讲,我觉得这本书真的是一本非常好的objective-C入门教材,尤其是对于已经有C语言和C++语言基础的人来讲,看起来更加易懂,而且还能从中找到C/C++的亲切感。

        首先,我想还是从大体上先回顾一番整本书的入门过程。通读全书后,在我的理解上将它分成了六大阶段。第一阶段,无不例外,Hello小程序倍受各门语言的青睐,同样也成为了这门书引领我们走进objective-C世界的第一个小程序。在这小段代码中给我们介绍了objective-C程序的最基本的框架,如何import一个头文件等。第二阶段,介绍面向对象编程的基础知识,如何继承一个类,如何在自己的类中复合另外一些类,也就是在一个类中创建另外一个类的实例作为自己的变量,如何把一个类框架重构分配到各个对应的文件中。这段流程跟C++入门可以说是有异曲同工之妙,两者之间的不同我觉得主要就在于关键字从class到interface和implements的一个转化而已。第三阶段,是介绍它高富帅级别的开发工具,和FoundationKit里面封装好的NSString,NSArray,NSDictionary等对象。第四阶段,是介绍它的内存管理和对象初始化的方法,特别是它的内存管理模式retain和release的交错使用,我想对于很多程序员来说都是挺蛋疼的地方,而且我个人觉得内存管理的问题应该是操作系统层面的开发人员需要解决的问题,而不应该抛给应用层的开发人员去忧虑的,应用层的开发人员应该花更多的时间在上层实现上,而不是把时间浪费在内存回收问题上。所以我就很喜欢JAVA的开发,它几乎不需要去担忧内存的回收机制,这有助于缩短JAVA工程师的开发周期,不过也正因为如此降低了JAVA的效率。我觉得最起码也要像C++那样,只需要关注new和delete配对出现就好了,不过值得庆幸的是,我前几天尝试做IOS的应用,发现ARC的机制已经帮我们解决了这个后顾之忧了。第五阶段,是介绍objective-C的特性,类别还有它的协议,正是这部分让我喜欢上这门语言,这些特点可以给开发者很大的方便,一句@property让我们节省了很多简单重复的getter和setter的方法的实现,而且创建类别可以提供很大的自由度,不过凡是都是利弊共存的,因为当给一个类创建一个类别里存在同名函数的时候,它会优先调用类别的函数,这样就会出现,在一个大项目中,某个组员不小心在类别中重载了原来的方法,而其他人不知道去调用的时候,就会造成难以察觉的错误。第六阶段,是介绍利用AppKit开发界面,文件加载与保存的做法,还有键/值编码和谓语(NSPredicate)的相关知识。这部分主要的感悟在于其文件读写方式和它封装好的那些NSData的完美结合,提供很大的方便。

        或许你在通篇读书笔记中看到的都是我把objective-C与我之前学过的C/C++/JAVA来做比较,不过我觉得只有在比较中才能体现出这门语言的优劣性,也在比较中才有话可讲。在这里我想阐述一下自己感悟最深的几点。

        首先是,对于objective-C语言的类实现,它提供了@property特性的确给了我们很大的方便,这是十分值得肯定的,另外,值得关注的是它对于类中成员的权限控制问题,虽然书上的作者在头头是道地谈论之所以不选择C++里面的那种public和private的公有成员和私有成员严格区分的机制可以实现动态有多大的好处,然后最后一小句略微带过一下其副作用,但是我不是很赞成这种利大于弊的看法。诚然,我承认这样的机制会给程序带来很大的自由度,程序员能在任何时候,任何地方都能调用类里面的所有方法,以便能快速实现自己的目标。但是我一直认为,既然能称得上是一个类,就必须要有其封装性和一定的隐私性,而不是像C语言中的struct,仅仅把相关联的信息聚合起来而已。一个类中肯定是有一些方法不想让外界直接能操作到的,而只是想公开一些接口,如果需要用到我的东西的话,就必须调用我的接口,这在一定程度上很好的保护到自己的数据,不让别人有意或者无意中造成破坏。另外,严格划分公有和私有成员也能够给调用者提供方便,他们只能看到和调用自己能用的部分,而毋须担心自己会不会对内部造成破坏或者用到了不合法的部分,即使真的不小心调用了,编译器也会出错提醒。所以,综合而言,我自己更加倾向于有区分public和private权限的类。

          然后,是强大的id类型来实现多态,我很喜欢objective-C的这个特点。当我第一次看到出现id这个类型的时候,我感觉相当的疑惑,难道是像数据库那样有id之类的。后来越看越不对劲了,怎么所有的对象实例都可以赋值给id类型。难道是泛型多态的用法?然后我在网上查找了很多资料学习了,终于搞懂了内部实现的原理。原来objective-C里所有的类都是继承了NSObject这样的父类,而id就是一个指向NSObject对象的指针,可以指向任何继承了NSObject类型的对象,通过这样的方法实现多态。而且id本身就被定义是一个指针类型了,所以它的实例不需要再加*号,默认是指向一个nil的空对象。不过,在这里值得注意的是,它虽然是个泛型指针,但是不可以指向C中的int ,char ,float,double等基本类型的,这源自于它是个NSObject类型的指针,NSObject是所有其他衍生类的父类。谈及到多态问题,顺便也记录一下自己学到的objective-C另外两种实现多态的方法,一种是通过协议来实现多态,<协议名>里面已经规定好了各种函数的接口,使用者可以根据自己的个人的不同需要在每个接口函数中具体实现即可。另外一种是通过选择器selector来动态绑定,selector这个知识点在《objective-C基础教程》上没有提及到,是我前几天看《IOS开发基础教程》的时候看到,然后在网上找资料学的,通过@selector()确定方法名,在不同的类对象中动态绑定不同的方法,从而实现运行时的多态。

        当然,感悟颇深的还有一个个[]括起来的函数写法;还有开始觉得奇葩,后来慢慢适应又觉得挺好用的中缀语法表达式;还有功能强大而且灵活的类别等等,在此就不一一陈述了。总而言之,每门语言总有其优势,又有其劣势,世界是公平的,任何东西都不是完美的,如果有一门是非常完美的话,那么其他语言就会失去存在的意义和价值了,根据不同的需求择其善者而从之即可。

原创粉丝点击