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中的对象使用特性,这里简单总结一下. 一. 继承 在面向对象编程中,子类可以通过继承得到父类的可以继承的的属性和方法,在 ...
随机推荐
- Python批量插入SQL Server数据库
因为要做性能测试,需要大量造数据到数据库中,于是用python写了点代码去实现,批量插入,一共四张表 简单粗暴地插入10万条数据 import pymssql import random __auth ...
- 'UIShell.OSGi.MvcWebExtension.BundleRuntimeControllerFactory' did not return a controller for the name 'Home'.
在使用osgi.net 框架的时候,有时会遇到这样的错误: 解决办法: 1. 检查项目文件夹下的 log 日志文件,因 osgi.net 在运行时(包括异常和操作)都会在项目的目录下生成 日志文件,并 ...
- hdu 3336【Count the string】(KMP)
一道字符串匹配的题目,仅仅借此题练习一下KMP 因为这道题目就是要求用从头开始的n个字符串去匹配原来的字符串,很明显与KMP中求next的过程很相似,所以只要把能够从头开始匹配一定个数的字符串的个数加 ...
- javascript设计模式-观察者模式
观察者模式定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己. UML示意图: 其中的角色: Subject:主 ...
- ASP.NET Session丢失的情况
正常操作情况下会有ASP.NET Session丢失的情况出现.因为程序是在不停的被操作,排除Session超时的可能.另外,Session超时时间被设定成60分钟,不会这么快就超时的. 现在我就把原 ...
- 浅谈Bootstrap自适应功能在Web开发中的应用
随着移动端市场的强势崛起,web的开发也变得愈发复杂,对于个体开发者来说,自己开发的网站,在电脑.手机.Pad等上面都要有正常的显示以及良好的用户体验.如果每次都要自己去调整网页去匹配各个不同的客户端 ...
- Linux Hugetlbfs内核源码简析-----(二)Hugetlbfs挂载
本文只讨论执行"mount none /mnt/huge -t hugetlbfs"命令后,mount系统调用的执行过程(基于Linux-3.4.51),不涉及进程相关的细节. m ...
- Web前端性能优化的9大问题
1.请减少HTTP请求基本原理:在浏览器(客户端)和服务器发生通信时,就已经消耗了大量的时间,尤其是在网络情况比较糟糕的时候,这个问题尤其的突出.一个正常HTTP请求的流程简述:如在浏览器中输入&qu ...
- 服务器下自动备份MySQL
Linux下 service crond restart */ * * * * /home/mysqlbackup.sh >/home/runssh.log backup.sh #bin/bas ...
- highcharts与highstock实例
highcharts实例代码 <head> <title>highcharts报表示例</title> <meta http-equiv="Cont ...