Object C和C#的差异
从C#到Object C,循序渐进学习苹果开发(1)--准备开发账号和开发环境
本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台开发苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验,因为一旦方方面面都精通了,也就可能没太大的动力继续写这系列的文章了,文章中可能有一些地方说的不对或者不够完善的地方,希望大家多多指正,共同提高。
由于本人起步Object C的苹果开发比较晚,但是因为自己有着比较深厚的C#开发背景,因此在很多方面都会和我之前的经验做比较,因此本系列文章对于从C#转向Object C的苹果开发来说,应该是比较合适的。
开始介绍这些系列内容之前,花上一些时间做一些自己的背景介绍,希望大家了解起步的背景和我自己的一些感想,以期达到相互共鸣,加深体会。
1、个人技术背景
从事C#语言的开发超过10年了,虽然期间也用过微软的其他语言,如VB6、VB.NET做过开发等,不过都是一段段小插曲,最终还是主要使用C#做开发,包括Winform的开发、Web上面的开发(Webform、JQuery、MVC等),在这方便也有自己的一些见解及较多的积累,包括自己的《Winform开发框架》、《Web开发框架》、《WCF开发框架》、《混合式开发框架》等以及一些其他应用程序,如较早期开发的送水管理系统、酒店管理系统、仓库管理系统,以及后来开发的很多应用程序,如病人资料管理系统、客户关系管理系统等等,还有很多其他基于QQ开发、邮件处理、赶集网数据采集、Visio二次开发、Socket网络通讯、硬件串口的开发方面都有所涉及,基本上这么多年来,把认为重要和感兴趣的.NET技术都学习了一把。有一些技术和产品的积累,也算对得起这么多年来的技术研究了。
书籍撰写方面,早期也就参加过,年轻力壮的时候,生活拮据的年代,ASP技术和ASP.NET技术盛起的时候,分别写过一本《ASP与网站开发实战》和《ASP.NET与网站开发实践教程》,写书的辛苦和出版商的奸诈,从中可以深刻体会到。
俗话说,技不压身,很早就开始想转入苹果开发的系列了,最初从购买自己的Iphone4s开始,就有这个念头,那时候还很早,刚刚2012年初发布的时候就入手一台,同年花钱弄了一个IMAC,一直用不习惯,不过好在安静、方便、大屏幕,偶尔用来晚上玩玩,白天工作不用。
2、苹果平台的转换
苹果桌面操作系统的使用习惯和Windows很不同,你可能习惯在WIndows里面使用Ctrl,而Mac系统主要用Command键替代,虽然键盘也有control键,但是意义完全不同,传统的Windows的Shift按键在Mac系统里也用Option键替代。最开始默认的苹果鼠标还没有右键功能,用了好久才发现,可以启用右键菜单功能,甚至滚轮的方向都有所不同。总之,用惯了Windows平台,你使用Mac系统,会有一个适应的过程。
使用苹果的Mac系统,你也可以使用Windows传统的大键盘,不过建议还是选择较贵的苹果小键盘,虽然不太习惯按键太小,但是很多快捷功能,你在Windows键盘里是不起作用的,这个非常不方便,反正选择配套就对了,呵呵。
苹果的系统,很多功能都在菜单里面寻找,在我们开发之前,最好把基本的系统应用都熟悉一下,一个对这个系统有个了解,二个对苹果的各种操作有一个详细的概念,否则你还不知道文件如何管理呢。
我的操作系统原来装的是猎豹系列的,也安装了XCode开发工具了,前阵子想入手开发的时候,把系统升级到最新,也把XCode更新到了5.02,这个整体系列的更新文件有点大,基本上下载了一天的时间,安装倒是很快,但是可能偶尔会因为网速的原因,断掉,需要接着下载更新。
如果下载多次还是不能成功更新操作系统或者XCode,建议可以通过Mac系统的迅雷下载软件,里面有一个 Thunder Store,速度蛮快了,哈哈。
另外,在开发前,最好能够准备几个IOS设备,IPAD、IPhone都最好有,呵呵。由于XCode5已经不支持进行IOS6以下的版本调试了,因此我把自己的4S从5.1升级到了7.06,虽然新IOS7系统的界面不太习惯,不过为了开发方便,还是升级最好了。
3、注册开发者账号及设置
很早就知道注册苹果开发者账号,每年需要缴纳99美元,这个时候使用信用开来处理就很好,支持美元支付的就可以了,我使用招行信用卡,周末的时候申请的,好像第二第三天就搞定了,响应的速度还是很快的。
注册开发者账号与否,你都可以使用XCode进行程序开发,但是你开发的应用只能在模拟器中测试,不能在真机测试并发布,而且他们网站还有一些资源使用的限制,不过开始之前可以先熟悉整个开发的流程和知识,如果确定需要从事开发,注册购买一个开发者资格还是非常必要的。
以上红色部分是在苹果开发网站里最为重要的部分了。这里面涉及需要下载开发的证书,以及你需要调试的开发配备证书等。
通过一系列的设置和引导,你可能最终弄好了两个证书,一个是开发的证书,一个是发布的证书,你需要把它们保存并安装到你的Mac电脑上。
申请好后,打开其中的开发证书,看到有下载的链接按钮。
把他下载到本地,然后把它安装到本地的钥匙串里面即可。
弄好了这些后,你需要申请一个Provisioning Profile的开发证书,然后在XCode的【WIndow】【Organizer】里面把你要开发设备接入进来,因为苹果严格规定,只有安装了这个证书的IOS设备,才能用来真机调试,否则是不允许的,因此这些证书的作用就是标识设备是你的,能够用于开发调试。最好为了方便,把所有的IOS设备都接入进来了,截个图大家了解下。
最后,运行XCode的程序,自己创建或者打开一个Demo程序,大致了解下其界面布局吧(默认没有黑色背景的,我通过设置把它调整了以下,感觉眼睛舒服了很多。
4、相关知识的了解
要了解整个IOS开发的系列内容,当然需要全方位的知识掌握,在开发之前,我自己通过网上了解了很多Object C的基础知识,好像51CTO里面的系列文章还不错。看了不少,逐渐对这个语言也有所了解。
相对于电子书籍,传统的书籍也是很有必要的,因此,我自己也通过了图书馆借了一些书籍帮助了解,借助各种知识的加强学习,能够对XCode的使用和Object C的语法等使用有一个非常好的熟悉了解。如下面就是我自己从图书馆第一次接回来的书籍。
不过,对于全面了解Object C等的内容,我后来发现苹果开发平台里面的内容更是全面,虽然全部是英文的,但是看起来非常舒服,叙述的很流畅,关键一点,是苹果把最新最好的特点都叙述的很清晰了,这个比起其他书籍介绍的内容,更加好。
否则你如果看各种参差不齐的书籍,可能对很多地方都有疑问,如有些书籍或者网上的文章,还是在ARC的引入之前的,大量介绍retain release等内容,而Release在引入ARC后,已经不需要写了,引用计数交给编译器完成了。
如在苹果开发网站里面,有一些序列的文章很不错,我自己倒是花了一整天的时间把它学习了一遍,感觉介绍的非常清晰,内容都是苹果根据最新的特性进行更新的,这点非常棒。
Start Developing iOS Apps Today
好了,下一篇继续介绍IOS开发的相关的内容,主要介绍C#和Object C的一些相同和不同的地方,把他们做一些对比,以便加深学习印象。
从C#到Object C,循序渐进学习苹果开发(2)--Object C和C#的差异
本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台开发苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验。
在上篇《从C#到Object C,循序渐进学习苹果开发(1)--准备开发账号和开发环境》介绍了一些基本的转换感悟和一些基础的准备工作,还没有正式真实的介绍Object C和C#的之前差异,我们知道,从一种环境或者一种语言转换过去另外一种,我们都会做一些对比和理解,这样可以很容易把我们头脑的知识进行对接,在这个所有东西日益大同的背景下,我们相信,所有的语言特点都是相通的。
1、面向对象的类
1)类的定义
Object C(下称OC)和C#都是面向对象的语言,虽然OC比C#古老,起源自C,但是很多特点和C#都很接近了,在C#3.0里面才引入的扩展方法,在OC里面也存在了。
OC和C#都一样,他们继承的关系都是单继承的,没有C++的那种多重继承那么复杂,OC很有特点的一个要求就是把接口和实现完全分开,这点是熟悉C#开发的人员必须转换过来的思路,在OC里面,写一个类,先写接口定义,然后再写实现,它的语法和C#很大不同,但是也很容易理解。
OC的关键字一般都是以@符号进行标识,这点和C#的默认保留关键字不同,一般看到@interface, @property, @关键字,在最新版本的XCode里面,真是发挥到了极致了,包含了很多语法糖,基本上和C#走向了大同,这点在对象的初始化继续介绍。
OC的类定义放到.h文件里面,实现放到了.m文件里面,如下面是类的接口声明。
@interface SimpleClass : NSObject @end
而类的实现操作如下所示。
#import "SimpleClass.h" @implementation SimpleClass @end
上面只是一个演示类的概念,一般情况下,类都有属性或者方法,因此还需要增加很多东西。
另外OC和C#对比,没有了命名空间的概念,OC的类为了避免混淆一般通过前缀进行区分,如你看到的IOS基础类库,很多带有NS,UI,CA,等这样的前缀,就是这个原因。
2)方法的定义
如下面的接口声明一个方法,方法的定义
@interface XYZPerson : NSObject
- (void)sayHello;
@end
我们看到,上面的方法定义(接口定义)很简单,这里有一个 - 符号,是用来标识属于实例方法的,还有一种属于类级别的方法,用+符号标识,这个加号,类似于C#语言里面的static关键字,默认在方法定义为-的实例方法,都是类似于C#里面的public方法了。
这个(void)定义是返回值的标识,C#是不需要括号的void标识无返回值,方法最后需要括号标识。
- (void)sayHello;
这个方法的定义没有参数因此是这样写的,如果方法有多个参数,这个OC就很有意思,我感觉这个是OC里面最有个性的一个地方了。
如果方法如下所示:
- (void) setCaption: (NSString*)input;
类方法的调用是通过空格,而C#通过点进行调用,这点也有所不同,OC通过在一个[]里面空格进行引用,如下所示。
[object method];
[object methodWithInput:input];
刚才定义的sayHello方法,它的调用可能就是如下方式了
[self setCaption:@"Default Caption"];
如果方法的定义为多个参数(也叫多重参数),定义如下。
-(void) setNumerator: (int) n andDenominator: (int) d;
那么方法的调用就很有意思了。
[frac2 setNumerator: 1 andDenominator: 5];
如果还有更多的参数,那么也就一直使用这样的累加方式,这个有点接近阅读习惯,呵呵。
3)参数的定义
说完方法的定义和使用,我们介绍下类里面的属性的定义,我们知道C#里面的属性定义很简单了,如
public string Name {get;set;}
回来看看OC如何定义属性的,一般在.h的接口定义里,可以这样定义。
@property NSString *firstName;
@property NSString *lastName;
然后在实现类代码里面,添加它的对应代码@synthesize的关键字
@synthesize firstName, lastName;
属性当然也可以指定为只读的,如下代码所示
@property (readonly) NSString *fullName;
另外,我们还需要清楚,属性默认是线程安全的,也就是atomic,还有它是强类型Strong的。
@interface XYZObject : NSObject
@property NSObject *implicitAtomicObject; // atomic by default
@property (atomic) NSObject *explicitAtomicObject; // explicitly marked atomic
@end
在很多地方,我们使用属性的时候,都不需要指定它的线程安全特性,因为那样效率更高,一般的属性定义代码如下所示。
@property (strong, nonatomic) IBOutlet UILabel *lblName;
@property (strong, nonatomic) IBOutlet UITextField *txtInput;
至于是不是所有的属性都应该指定为Strong,这个肯定不是的,strong的另外一种类型是weak,它是表示弱类型,强类型和弱类型主要是针对ARC来说的,它是引用计数的范畴,Strong相当于原来的retain。
一般情况下,为了避免一些强类型的对象属性导致出现相互引用的问题,在代理类和数据源对象,还有一些如UITable的对象属性,他们的属性定义必须指定为weak的。
2、对象的类型和初始化工作
在C#里面,我们知道,它里面包含了有一些基本类型(Primitive type)和一些包装后的对象类型,如它的基本类型包括string int char float long double decimal等等,它的对应包装类型有String Int32 Char Single Int64 Double Decimal等等。
在OC里面,同样也有这样的情况,OC的基本类型继承自C语言的基础类型,包括有int float double char 等基础类型,也有很多NS开头的引用类型(或者说包装类型),如NSString NSNumber NSDate NSData NSValue等等,而很多集合类型NSArray NSMutableArray NSDictionary等都需要添加引用类型的对象。
另外和C#的Object对象类似或者动态类型关键字dynamic指定的类型一样,OC里面包含了一个id的类型,这个是一个不确定的类型,它可以看成是一个任何类型的弱定义。
id类型是一个独特的数据类型,在概念上,类似java的Object类,可以转换为任何数据类型。换句话说,id类型变量可以存放任何数据类型的对象。在内部处理上,这种类型被定义为指向对象的指针,实际上是一个指向这种对象的实例变量的指针。需要注意的是id是一个指针,所以在使用id的时候不需要加星号;比如说:id foo=nil;
1)类对象的初始化
我们知道,OC里面很多都是通过alloc init这样的方式进行初始化,如下面代码所示。
XYZObject *object = [[XYZObject alloc] init];
而C#里面大多数使用new方式进行初始化,其实OC里面,也一样可以通过new方式进行初始化,不过仅限在默认构造函数的方式进行,如下的代码是等同于上面的语句的。
XYZObject *object = [XYZObject new];
不过好像很多人都习惯用第一种方式初始化对象。
2)字符串的初始化
相信很多人使用OC的时候,第一个印象最深的我觉得可能是NSString类了,这个是和C#的String有点类似,都是固定的字符串对象,如果需要变化类型的字符串对象,C#里面是可以使用StringBuffer,而OC里面可以使用NSMutalbeString,NSMutableString好比一个字符串链表,它可以任意的动态在字符串中添加字符串 删除字符串 指定位置插入字符串,使用它来操作字符串会更加灵活。
字符串的定义和初始化和简单,我们可以通过下面的方式进行初始化。
NSString *someString = @"Hello, World!";
我们知道,C#也可以使用@字符进行赋值,虽然一般情况使用在多行的情况下,但是在OC,这个@字符不能省略。
其他数据类型初始化,很多都依靠@字符进行,这个@字符可以说是非常强大的,它也可以说是一个很好的语法糖,如下面初始化各种类型的代码如下(在OC里面,NSNumber可以放置任何引用类型)
NSNumber *myBOOL = @YES;
NSNumber *myFloat = @3.14f;
NSNumber *myInt = @42;
NSNumber *myLong = @42L;
NSNumber类型可以装纳各种类型,同样它也可以转换为其他对应的类型,如下代码所示
int scalarMagic = [magicNumber intValue];
unsigned int scalarUnsigned = [unsignedNumber unsignedIntValue];
long scalarLong = [longNumber longValue]; BOOL scalarBool = [boolNumber boolValue]; float scalarSimpleFloat = [simpleFloat floatValue];
double scalarBetterDouble = [betterDouble doubleValue]; char scalarChar = [someChar charValue];
另外,由于OC里面引入了一个id类型,可以认为它的作用和C# 3.0引入的动态类型相当,它可以在运行时进行确定对象是否具有某个方法,而不会在编译的时候强制指定。
如下面的代码编译通过,运行的时候可能出错。
id someObject = @"Hello, World!";
[someObject removeAllObjects];
之所以编译的时候,不检查它的对象是否有removeAllObject接口方法,是因为这儿的someObjec指定为了id的动态类型,所以编译器会不检查它的方法。
3)对象集合的初始化
刚才上面介绍了字符串等各种类型的初始化,很多采用了强大的关键字@进行初始化,这个语法糖减少了很多繁琐的方法调用,对于集合的初始化,尤其这样。
如果按照传统的集合定义方式,一般是通过下面的方法。
NSArray *someArray =
[NSArray arrayWithObjects:someObject, someString, someNumber, someValue, nil];
在里面的集合,最后必须加上一个nil的东西,这个在C#的领域里面是不需要增加这样的标识的,在Object C里面,如果你要通过arrayWithObjects方法进行构造,必须增加一个这样的东西,告诉它这个是最后了,如果你把这个放到第二位,那么构造的集合也只有两个对象了,很奇怪了。
如果采用了强大的@方法构造,一切都和C#相似了,这里你只能佩服它的神奇之处了。
NSArray *someArray = @[firstObject, secondObject, thirdObject];
如下面定义一个字符串的集合是这样的。
NSArray *unsortedStrings = @[@"gammaString", @"alphaString", @"betaString"];
在C#里面,我们经常用到了字典对象,这个对象非常方便。当然在OC里面,也肯定会有这样的东西,毕竟很多语言都会支持的。
这个字典类型也是一个集合类型,它的传统构造方法如下所示
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
someObject, @"anObject",
@"Hello, World!", @"helloString",
@42, @"magicNumber",
someValue, @"aValue",
nil];
它这个看起来很怪异,添加指点是按照object,key的这样方式添加的,这个与我们使用C#的习惯有很大的不同哦,而且最后还带了一个nil的尾巴。
如果采用@构造函数,一切又都清净了,已经是key,value方式进行存储,而且不用nil了,如果你添加了nil,那么会出错的。
NSDictionary *dictionary = @{
@"anObject" : someObject,
@"helloString" : @"Hello, World!",
@"magicNumber" : @42,
@"aValue" : someValue
};
集合中,如果取某个对象,那么通过下面的方法进行获取
NSNumber *storedNumber = [dictionary objectForKey:@"magicNumber"];
也可以通过下标括符进行获取
NSNumber *storedNumber = dictionary[@"magicNumber"];
如果是一般的数组集合,可以通过下面方式获取,这种方式和c#很类似了。
1
|
NSNumber *storedNumber = array[0]; |
由于时间和篇幅的问题,关于OC的各种和C#对比的特性,以后继续介绍,OC里面还涉及很多相关的特点,如扩展方法,协议(类似接口),代码块等等内容,以及XCode的各种使用特性,有空继续介绍。
Object C和C#的差异的更多相关文章
- 两个list<object> 比较 得到相同数据 差异数据
package com.lizi.admin.utils.contrast;import java.lang.reflect.InvocationTargetException;import java ...
- ES6 - Note4:Class类
1.Class类的介绍 在ES6中新增了Class类的概念,让语法看起来更像是面向对象编程,其实这可以说是一个语法糖,ES5可以做到Class绝大部分功能,但也有一些不同.在ES6以前,可以通过构造函 ...
- JS的IE和FF兼容性问题汇总
转自:蓝色理想 以下以 IE 代替 Internet Explorer,以 MF 代替 Mozilla FF 一.函数和方法差异 1. getYear()方法 [分析说明]先看一下以下代码: var ...
- 手动实现一个虚拟DOM算法
发现一个好文:<深度剖析:如何实现一个 Virtual DOM 算法> 源码 文章写得非常详细,仔细看了一遍代码,加了一些注释.其实还有有一些地方看的不是很懂(毕竟我菜qaq 先码 有时间 ...
- YOLO v2 损失函数源码分析
损失函数的定义是在region_layer.c文件中,关于region层使用的参数在cfg文件的最后一个section中定义. 首先来看一看region_layer 都定义了那些属性值: layer ...
- 非典型的scala程序及其编译后的结果
初学Scala Folder structure以及部分代码 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2xldmVyd3lx/font/5a6L5L ...
- 各浏览器下使用 OBJECT 元素和 EMBED 元素嵌入 Flash 存在差异
标准参考 OBJECT 元素定义了一个嵌入的对象.其引入的初衷是取代 IMG 和 APPLET 元素.不过由于安全等各方面原因以及缺乏浏览器支持,这一初衷并未实现.浏览器的对象支持依赖于对象类型.然而 ...
- &class::data_member与&object.data_menber之间的差异
前者取data_member在class中的offset:指针类型是:type class::* 后者将会得到该data_member在内存中的真正地址:指针类型是:type*
- 比较一下以“反射”和“表达式”执行方法的性能差异
由于频繁地使用反射会影响性能,所以ASP.NET MVC采用了表达式树的方式来执行目标Action方法.具体来说,ASP.NET MVC会构建一个表达式来体现针对目标Action方法的执行,并且将该表 ...
随机推荐
- Android 4.4(KitKat)表格管理子系统 - 骨架
原文地址:http://blog.csdn.net/jinzhuojun/article/details/37737439 窗体管理系统是Android中的主要子系统之中的一个.它涉及到App中组件的 ...
- NSOJ Minimum Transport Cost
These are N cities in Spring country. Between each pair of cities there may be one transportation tr ...
- Tair LDB基于Prefixkey中期范围内查找性能优化项目总结
"Tair LDB基于Prefixkey该范围内查找性能优化"该项目是仅一个月.这个月主要是熟悉项目..以下从几个方面总结下个人在该项目上所做的工作及自己的个人所得所感. 项目工作 ...
- django csrf_token生成
django模板中生成csrf_token的不同方式 系统环境 CENTOS 6.4 python 2.7.6 django 1.7.1 当post提交表单的的时候,是需要 csrf_token的, ...
- LeetCode_算法及数据结构覆盖统计
[输入]共计151道题的算法&数据结构基础数据 (见附录A) [输出-算法]其中有算法记录的共计 97道 ,统计后 结果如下 top3(递归,动态规划,回溯) 递归 动态规划 回溯 BFS ...
- 对[foreach]的浅究到发现[yield]
原文:对[foreach]的浅究到发现[yield] 闲来无事,翻了翻以前的代码,做点总结,菜鸟从这里起航,呵呵. 一.List的foreach遍历 先上代码段[1]: class Program { ...
- SSAS系列——【08】多维数据(程序展现Cube)
原文:SSAS系列--[08]多维数据(程序展现Cube) 1.引用DLL? 按照之前安装的MS SQLServer的步骤安装完成后,发现在新建的项目中“Add Reference”时居然找不到Mic ...
- Redis 优化查询性能
一次使用 Redis 优化查询性能的实践 应用背景 有一个应用需要上传一组ID到服务器来查询这些ID所对应的数据,数据库中存储的数据量是7千万,每次上传的ID数量一般都是几百至上千数量级别. 以前 ...
- android studio 添加到项目库中的项目
工程-对-new module-Android Library-module name和package name 它应该在同一个库被引入. 然后在该文件夹replace新的library 在gradl ...
- bootstrap基本标签总结2
[布局]bootstrap基本标签总结2 缩略图 <div class="container"> <div class="row"> ...