Object C学习初步
最近乘着项目不太紧张的时候,赶紧给自己冲了一下电。其实我自己最熟悉的平台应该是.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学习初步的更多相关文章
- Object C学习笔记24-关键字总结
学习Object C也有段时间了,学习的过程中涉及到了很多Object C中的关键字,本文总结一下所涉及到的关键字以及基本语法. 1. #import #import <> 从syste ...
- Object C学习笔记22-#define 用法
上一篇讲到了typedef 关键字的使用,可以参考文章 Object C 学习笔记--typedef用法 .而在c中还有另外一个很重要的关键字#define. 一. #define 简介 在C中利用预 ...
- Object C学习笔记21-typedef用法
在上一章的学习过程中遇到了一个关键字typedef,这个关键字是C语言中的关键字,因为Object C是C的扩展同样也是支持typedef的. 一. 基本作用 typedef是C中的关键字,它的主要作 ...
- Object C学习笔记18-SEL,@ selector,Class,@class
本章是对上一章<<Object C学习笔记17-动态判断和选择器>>的一点补充,所以比较简单点. 一. SEL 类型 在上一篇介绍了几个方法,都只是介绍了其使用方式但是没有具体 ...
- Object C学习笔记17-动态判断和选择器
当时学习Object C的时被人鄙视了一顿,说使用.NET的思想来学Object C就是狗屎:不过也挺感谢这位仁兄的,这让我学习的时候更加的谨慎.今天的学习笔记主要记录Object C中的动态类型相关 ...
- Object C学习笔记10-静态方法和静态属性
在.NET中我们静态使用的关键字static有着举足轻重的作用,static 方法可以不用实例化类实例就可以直接调用,static 属性也是如此.在Object C中也存在static关键字,今天的学 ...
- Object C学习笔记8-字符串NSString之二
5. 字符串是否包含 hasPrefix 判断字符串是否以某个字符串开头 hasSuffix 判断字符串是否以某个字符串结尾 NSString *str1=@"Object C学习正在进行中 ...
- Object C学习笔记24-关键字总结(转)
学习Object C也有段时间了,学习的过程中涉及到了很多Object C中的关键字,本文总结一下所涉及到的关键字以及基本语法. 1. #import #import <> 从syste ...
- Object C学习笔记23-继承,重写,重载
前面的学习都一直在使用Object C对象,但是没有具体总结过Object C中的对象使用特性,这里简单总结一下. 一. 继承 在面向对象编程中,子类可以通过继承得到父类的可以继承的的属性和方法,在 ...
随机推荐
- EF调用存储过程遇到的问题
注意 实体类Statistics的字段名和存储过程返回集合的列名要相同才行
- RC振荡器与有源滤波器1
自我总结,有错误欢迎指出! 一.振荡器原理: 对于正反馈,有如下公式: 讨论: 1.当A*F(jw)=1时 Af→∞(物理意义:自激振荡): 2.在f0上,F(jw)相移为0或2n∏:(因此,在f0处 ...
- 循环链表Josephus问题(c,cpp)
问题描述: 设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m个的人出列,然后从出列的下一个人重新开始报数,数到第m个的人又出列,.......,如此反复直到所有的人出列为止. Joseph ...
- LARGE_INTEGER
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR ipCm ...
- PZISP自动下载软件运行时出现“应用程序无法启动,因为应用程序的并行配置不正确”
在win7下以管理员身份运行“PZISP自动下载软件”时出现“应用程序无法启动,因为应用程序的并行配置不正确”时,是因为系统里面没有一些visual c++库 想一想,反正以后也要用上VS2010的, ...
- android Tab =viewpager+fragmnet
1.定义几个fragment 的subclass 如fragmentone,fragmenttwo; public class fragmentthree extends Fragment { pri ...
- 【MySQL】MySQL锁和隔离级别浅析二 之 INSERT
最近在整理线上性能时,发现一台线上DB出现两个insert产生的死锁问题 ------------------------ LATEST DETECTED DEADLOCK ------------- ...
- rel=nofollow
nofollow是什么意思? nofollow是html标签的一个属性值,Google推荐使用nofollow,告诉机器(爬虫)无需追踪目标页,是指禁止蜘蛛爬行和传递权重,但是如果你是通过sitema ...
- JS常用小技巧
iframe子窗口调用父窗口方法 parent.functionName(); 二.iframe 父窗口和子窗口相互的调用方法 1.IE中使用方法: 父窗口调用子窗口:iframe_ID.iframe ...
- IntelliJ IDEA 快捷键和设置
IntelliJ IDEA 使用总结 http://my.oschina.net/xianggao/blog/97539 IntelliJ IDEA 问题解决:1.乱码,主要是快捷键的字样显示乱码 中 ...