本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台开发苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验。

在上篇《从C#到Objective-C,循序渐进学习苹果开发(1)--准备开发账号和开发环境》介绍了一些基本的转换感悟和一些基础的准备工作,还没有正式真实的介绍Objective-C和C#的之前差异,我们知道,从一种环境或者一种语言转换过去另外一种,我们都会做一些对比和理解,这样可以很容易把我们头脑的知识进行对接,在这个所有东西日益大同的背景下,我们相信,所有的语言特点都是相通的。

1、面向对象的类

1)类的定义

Objective-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#里面是可以使用StringBuilder,而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的各种使用特性,有空继续介绍。

本文转自博客园伍华聪的博客,原文链接:从C#到Objective-C,循序渐进学习苹果开发(2)--Objective-C和C#的差异,如需转载请自行联系原博主。

从C#到Objective-C,循序渐进学习苹果开发(2)--Objective-C和C#的差异相关推荐

  1. 从C#到Objective-C,循序渐进学习苹果开发(7)--使用FMDB对Sqlite数据库进行操作

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本篇主要开始介绍基于XCod ...

  2. 从C#到Objective-C,循序渐进学习苹果开发(1)--准备开发账号和开发环境

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验,因为一旦方方面面都精通了,也 ...

  3. 循序渐进学习嵌入式开发技术

     嵌入式时代已经来临,你还在等什么?   ---循序渐进学习嵌入式开发技术最近经常有用人单位给我打来电话,问我这有没有嵌入式Linux方面的开发人员,他们说他们单位急需要懂得在嵌入式linux环境下的 ...

  4. iPhone软件开发编程语言Objective C学习资料

    iPhone软件开发编程语言Objective C学习资料 一.XCode.Objective-C.Cocoa说的是几样东西? 答案:三样东西.   XCode:你可以把它看成是一个开发环境,就好像V ...

  5. 学习苹果Swift语言的一些在线资源

    Swift 是苹果为 OS X 和 iOS 平台引入的一种新的程序设计语言,这种程序设计语言已经激发了开发者社区的大量关注.仅仅几天之内,在 Stack Overflow 网站上提出的关于 Swift ...

  6. iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象...

    1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较 ...

  7. zzfrom水木-Linux环境学习和开发心得(作者:lunker)

    转自水木lunker,非常好的文章,在此鸣谢之. 本人水平有限,如果有错误和遗漏,或者有更好的建议,请大家认真的拍. 强烈建议: 文中涉及的图书最好入手一个英文版的,如果实在阅读有困难,可以在电脑中准 ...

  8. [翻译] 学习iOS开发的建议:如何从菜鸟到专家

    [文章原地址] http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-from-novice-to-expert/ 翻译有误之处请勿见笑, ...

  9. 零基础如何学习 iOS 开发?

    我创建了一个 CS193P - SwiftUI 和 iOS 开发的学习群组,有兴趣可以加入,群内学习者以北美为主,因此聊天请使用英语,谢谢.加入 Slack 群组 正文: 建议从 SwiftUI 开始 ...

最新文章

  1. ystem.Windows.Forms.SplitContainer : ContainerControl, ISupportInitialize
  2. 通报批评!国家基金委公布2021年查处的不端行为案件处理决定(第二批次)
  3. 2021消费者置业信心指数报告
  4. mysql中同一天入职怎么表示_ORACLE入职考试题及答案
  5. 关于样本量的快速证明
  6. 一个虚拟社交公司的融资历程
  7. 计算机网络电缆是什么,插入Cat的计算机网络电缆和插入路由器的计算机的网络电缆有什么区别?...
  8. python使用逐行读取,出现空行,清楚空行方法
  9. Android流量监控以及流量防火墙的概述
  10. linux添加windows隐藏属性,解决文件夹隐藏属性无法取消的办法
  11. 芯片设计验证中遇到的VCD、VPD以及EVCD到底是什么?
  12. 岁月温柔-3 清明节医院复查,去昆明过冬是否会是一种奢望?
  13. echarts的边框图片之切图(重要)以及公共面板样式的制作
  14. 记测试双十一秒杀活动的坎坷历程
  15. ppt中插入和删除动画
  16. scratch鲜为人知的技巧-初级篇
  17. libjpeg库使用举例
  18. 【笑话】网络上的经典马屁回贴~~~
  19. 【数据库】数据库管理系统(Database Management Systems)
  20. ReactDOM.render 是如何串联渲染链路的?(中)

热门文章

  1. tor the onion router下载_人教版英语知识点练习:七年级下册Unit8要点讲解,重点短语句型,语法聚焦(可下载打印版,附答案)...
  2. php4.3.x 5.2.x,XDEBUG for PHP 5.3.0
  3. vue划入划出事件_基于vue中对鼠标划过事件的处理方式详解
  4. python做collatz猜想_R中的Collatz猜想
  5. dom4j工具类_基于DOM4J的XML文件解析类
  6. ssm注解配置连接mysql_SSM框架整合(注解)-Spring+SpringMVC+MyBatis+MySql
  7. JDOM与DOM的相互转换
  8. Calendar的api方法
  9. 在VsCode里编写和运行不同语言的程序
  10. VB讲课笔记12:文件管理