最近乘着项目不太紧张的时候,赶紧给自己冲了一下电。其实我自己最熟悉的平台应该是.net,所以当初上手windows phone的话是很快,我记得当初是一边跟着项目进展,一边自己开始学习前台的XAML语言以及页面的布局,所以一个项目跟下来的话windows phone平台也就差不多了。
早先就有过学习ios的想法,应该iphone实在是太酷了,感觉开发ios比windows phone更加有成就感。但是前前后后一直在往后推迟,因为ios的同事们一直给我灌输的思想就是oc语言还有挺难学的,相比较c#,jave实在是相差有点大。好吧!最近几天就是带着这种畏惧的思想开始看一些oc入门的书籍,整个看下来的话,其实也没有传说中的那么难嘛!
好了,不扯远了,让我们回到主题上面来吧!本文主要还是想要梳理一下自己学习过程中影响比较深的知识点,如果有什么不周到的地方欢迎拍砖。
首先如果你之前没有oc基础的话,你初一看oc代码,你会发现这很是奇怪呀!其实我本人觉得oc最大的特点就是更加的像我们的自然语言。首先在你利用xcode新建一个iphone项目之后,你会发现一个页面文件(.nib)竟然默认是关联着两个文件的(.h和.m),开始我学的时候我也很好奇这两个文件到底是什么东东呢?我想如果你做过windows phone或者andorid的话,你就会很习惯一个前台布局页面,一个后台代码逻辑处理页面(当然如果后台逻辑比较复杂的话,你可能需要拆分到不同的类文件)。好了,不卖关子了,其实.h文件又称作是头文件,在这个文件里面你可以定义需要关联到前台页面布局文件的控件,比如IBOutLet *UILabel;然后下面你需要提供该控件的属性,就跟c#里面的get,set一样。只不过在oc里面默认提供了特性语法,可以快速的实现属性的定义,当然在这个方法里面你还可以提供一些方法的签名。然后与当前该.h文件重名的.m文件就是具体的实现处理逻辑的地方。在这个.m文件里面,首先我们需要实现.h文件里面定义的属性和方法(注意这些属性、方法通常是需要关联到前台的页面控件上面的),然后我们就可以在这些方法里面定义我们自己的处理逻辑了。
在ios里面都是采用mvc模式的,所以页面和处理代码的脱离就全靠控制器了。比如我们在.h文件里面定义了一个按钮的点击事件,那么我怎样与前台页面的按钮关联起来呢?我们是不是可以像windows phone里面直接一个Button控件拖拽到页面,然后Click事件一订阅就自动关联起来了呢?哈哈,在ios里面你可能需要麻烦一点你先要将UIButton控件关联到一个控制器上面,然后再将相应的按钮事件关联到控制器(.h文件)里面定义的事件上面。
好了,现在能够将页面和代码处理逻辑关联起来了,那么后面我遇到一个比较棘手的问题就是我怎样能够将一些重复代码抽离出来呢?即我怎么能够像c#里面通过定义一些继承,接口,公共方法实现oop呢?这就涉及到oc里面的类、结构的定义了,在oc里面定义这些东东我们需要使用@符号。比如现在我们假设这样一种场景,我们需要在一个页面上面画出一个长方形和一个三角形,比较死板的方法是我们相应.m文件“啪啪啪”敲两个方法分别来实现长方形和三角形的绘制工作,好一点的话,我们可能会将两个方法里面重复的部分重构到另一个方法里面(重构的方法还是在该类里面,而不是另外一个基类里面)。那么我们有没有什么最有的做法呢?其实只要我们好好想一下这个问题的实现就会知道,它们无非是形状不同而已。我们完全可以将它们所具有的公共方法抽离到一个shape基类里面,然后两个类从中继承就可以了。
好了,说了这么多的具体页面实现细节,让我们来谈一谈cocoa这套框架吧!cocoa主要分为两部分:fundation kit和application kit,具体这两个有什么区别我也没有细细研究过,但是我明白的一点就是application kit似乎是更接近界面一点。在fundation kit里面我们可以找到NSString,NSArray,NSDictoary等一些常用的类型,你也需要奇怪为什么所有的类型前面都加了个NS呢?这就跟乔布斯,跟皮克斯有关系了,我还想说一点的就是cocoa这套框架页面从早先皮克斯的一套框架脱胎过来的。那么我们怎样定义这些变量呢?比如在c#,java里面我们需要一个string类型,我们就会直接string xxx;但是oc里面却不是这样的,我们需要NSString *xxx;有没有前面多了个*,这就是oc更接近c的原因了,在这个定义里面我们能够明确的看到当前的NSString变量是一个指针,它指向真正的对象。在c#,java里面虽然string类型也是引用类型,也指向真正的对象,但是它们将自己隐藏的更好了。好了,一个NSString类型的变量定义好了,我们怎样去初始化它们呢?是不是直接向c#里面直接丢个""或者stirng.empty过去就可以了呢?其实oc里面的实例化可以分为三类:1.new;2.使用相应的初始化函数;3.使用alloc init;oc里面一般是不使用new的,我个人认为是需要自己释放资源,当然你也可以将实例化的对象丢到自动释放池里面,而且事实上alloc init的这种方式就是这种情况;首先调用alloc分配资源,然后调用init初始化;
好了,说完oc里面一些基础的类型,让我们来看一看一些高级的特性:类别,委托,非正式协议,正式协议;在写oc程序的时候,最不习惯就是方法的使用通常要用[]括起来,其实习惯之后,你就会发现方法调用读来很想一句自然话;回到类别,类别就像是c#里面的扩展方法,比如现在我们设想一下这种情况,如果我们需要调用一个.tostring方法自动实现输出姓名+身份号+职业;c#里面最好的方法是使用扩展方法,oc里面也为我们提供这种实现,定义的方法是@类名<自定名称>,然后下面就是方法的实现。其实类别还为拆分代码,组织处理逻辑提供了便利;委托在oc里面算是用的比较多的了,因为本身mvc模式,例如一个UITableView展示数据之后,用户点击某一项的操作,我们需要委托到一个方法里面去处理,在头文件里面(.h文件)实现后面我们还需要显示的实现委托跟数据源;非正式协议就跟c#里面的接口差不多了,只不过非正式协议定义的方法我们不需要全部去实现罢了;正式协议里面我们需要用到一个专门定义的关键字,然后这里面定义的方法,我们需要跟接口一样全部实现;先说这么多了。
Object C学习初步