From C++ To Object-C(中文版)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

从C++到Objective-C(1):前言作者:DevBean日期:2011年03月18日发表评论(6)查看评论Objective-C可以算作Apple平台上“唯一的”开发语言。很多Objective-C的教程往往直接从Objective-C开始讲起。不过,在我看来,这样做有时候是不合适的。很多程序员往往已经掌握了另外一种开发语言,如果对一门新语言的理解建立在他们已有的知识之上,更能起到事半功倍的效果。既然名为Objective-C,它与C语言的联系更加密切,然而它又是Objective的。与C语言联系密切,并且是Objective的,我们能够想到的另外一门语言就是C++。C++的开发人员也更普遍,受众也会更多。于是就有了本系列,从C++的角度来讲述Objective-C的相关知识。不过,相比C++,C#似乎更近一些。不过,我们还是还用C++作为对比。这个系列不会作为一个完整的手册,仅仅是入门。本系列文章不会告诉你Objective-C里面的循环怎么写,而是通过与C++的对比来学习Objective-C一些更为高级的内容,例如类的实现等等。如果要更好的使用Objective-C,你需要阅读更多资料。但是,相信在本系列基础之上,你在阅读其他资料时应该会理解的更加透彻一些。说明:本系列大致翻译来自《FromC++toObjective-C》,你可以在这里找到它的英文pdf版本。下面来简单介绍一下Objective-C。要说Objective-C,首先要从Smalltalk说起。Smalltalk是第一个真正意义上的面向对象语言。Smalltalk出现之后,很多人都希望能在C语言的基础之上增加面向对象的特性。于是就出现了两种新语言:C++和Objective-C。C++不必多说,很多人都比较熟悉。Objective-C则比较冷门。它完全借鉴了Smalltalk的思想,有着类似的语法和动态机制;相比来说,C++则更加静态一些,目的在于提供能好的性能。Objective-C最新版本是2.0.我们的这个系列就是以Objective-C2.0为基础讲解。Objective-C是一门语言,而Cocoa是这门语言用于MacOSX开发的一个类库。它们的关系类似于C++和Qt,Java和Spring一样。所以,我们完全可以不使用Cocoa,只去用Objective-C。例如gcc就是一个不使用Cocoa的编译器。不过在MacOSX平台,几乎所有的功能都要依赖Cocoa完成。我们这里只是做一个区别,应该分清Objective-C和Cocoa的关系。从C++到Objective-C(2):语法概述作者:DevBean日期:2011年03月18日发表评论(0)查看评论关键字Objective-C是C语言的超集。类似于C++,良好的C源代码能够直接被Objective-C编译器编译。不同于C++直接改变C语言的设计思路,Objective-C仅仅是在C语言的基础上增加了一些概念。例如,对于类的概念,C++是增加了一个全新的关键字class,把它作为语言内置的特性,而Objective-C则是将类转换成一个struct去处理。所以,为了避免冲突,Objective-C的关键字都是以@开头。一个简单的关键字列表是:@class,@interface,@implementation,@public,@private,@protected,@try,@catch,@throw,@finally,@end,@protocol,@selector,@synchronized,@encode,@defs。Objective-C2.0又增加了@optional,@required,@property,@dynamic,@synthesize这几个。另外的一些值同样也类似于关键字,有nil和Nil,类型id,SEL和BOOL,布尔变量YES和NO。最后,特定上下文中会有一些关键字,分别是:in,out,inout,bycopy,byref,oneway和getter,setter,readwrite,readonly,assign,retain,copy,nonatomic等。很多继承自NSObject的函数很容易与关键字混淆。比如alloc,release和autorelease等。这些实际都是NSObject的函数。另外一个需要注意的是self和super。self实际上是每一个函数的隐藏参数,而super是告知编译器使用self的另外语义。注释Objective-C使用//和/*…*/两种注释风格。变量声明的位置Objective-C允许在代码块的中部声明变量,而不仅仅在块的最开始处。新增的值和变量BOOL,YES,NOC++中使用bool表示布尔类型。Objective-C中则是使用BOOL,其值为YES和NO。nil,Nil和id简单来说:每一个对象都是id类型的。该类型可以作为一种弱类型使用。id是一个指针,所以在使用时应注意是否需要再加*。例如id*foo=nil,实际是定义一个指针的指针;nil等价于指向对象的NULL指针。nil和NULL不应该被混用。实际上,nil并不简单是NULL指针;Nil等价于指针nil的类。在Objective-C中,一个类也是一个对象(作为元类Meta-Class的实例)。nil代表NULL指针,但它也是一个类的对象,nil就是Nil类的实例。C++没有对应的概念,不过,如果你熟悉Java的话,应该知道每一个类对象都对应一个Class实例,类似这个。SELSEL用于存储选择器selector的值。所谓选择器,就是不属于任何类实例对象的函数标识符。这些值可以由@selector获取。选择器可以当做函数指针,但实际上它并不是一个真正的指向函数的指针。@encode为了更好的互操作性,Objective-C的数据类型,甚至自定义类型、函数或方法的元类型,都可以使用ASCII编码。@encode(aType)可以返回该类型的C字符串(char*)的表示。源文件与C++类似,Objective-C同样建议将声明和实现区分开。Objective-C的头文件后缀名是.h,源代码后缀名是.m。Objective-C使用#import引入其它头文件。与#include不同的是,#import保证头文件只被引入一次。另外,#import不仅仅针对Objective-C的头文件,即便是标准C的头文件,比如stdlib.h,同样可以使用#import引入。C++头文件源文件//InfileFoo.h#ifndef__FOO_H__//compilationguard#define__FOO_H__//classFoo{...};#endif//InfileFoo.cpp#includeFoo.h...Objective-C头文件源文件//InfileFoo.h//classdeclaration,differentfrom//theinterfaceJavakeyword@interfaceFoo:NSObject{...}@end//InfileFoo.m#importFoo.h@implementationFoo...@endNS前缀我们前面看到的类NSObject,NSString都有一个前缀NS。这是Cocoa框架的前缀(Cocoa开发公司是NeXTStep)。函数和方法的区别Objective-C并不是“使用方括号表示函数调用”的语言。一开始很容易把[objectdoSomething];理解成object.doSomething();但实际上并不是这么简单。Objective-C是C语言的超集,因此,函数和C语言的声明、定义、调用是一致的。C语言并没有方法这一概念,因此方法是使用特殊语法,也就是方括号。不仅仅是语法上的,语义上也是不同的:这并不是方法调用,而是发送一条消息。看上去并没有什么区别,实际上,这是Objective-C的强大之处。例如,这种语法允许你在运行时动态添加方法。从C++到Objective-C(3):类和对象作者:DevBean日期:2011年03月19日发表评论(0)查看评论既然是面向对象语言,类和对象显然是应该优先考虑的内容。鉴于本系列已经假定你已经熟悉C++语言,自然就不会去解释类和对象的含义。我们直接从Objecti-C和C++的区别开始说起。Objetive-C使用的是严格的对象模型,相比之下,C++的对象模型则更为松散。例如,在Objective-C中,所有的类都是对象,并且可以被动态管理:也就是说,你可以在运行时增加新的类,根据类的名字实例化一个类,以及调用类的方法。这比C++的RTTI更加强大,而后者只不过是为一个“static”的语言增加的一点点功能而已。C++的RTTI在很多情况下是不被推荐使用的,因为它过于依赖编译器的实现,牺牲了跨平台的能力。根类,id类型,nil和Nil的值任何一个面向对象的语言都要管理很多类。同Java类似,Objective-C有一个根类,所有的类都应该继承自这个根类(值得注意的是,在Java中,你声明一个类而不去显式指定它继承的父类,那么这个类就是Object类的直接子类;然而,在Objective-C中,单根类的子类必须被显式地说明);而C++并没有这么一个类。Cocoa中,这个根类就是NSObject,它提供了很多运行时所必须的能力,例如内存分配等等。另外需要说明一点,单根类并不是Objective-C语言规范要求的,它只不过是根据面向对象理论实现的。因此,所有Java虚拟机的实现,这个单根类都是Object,但是在Objective-C中,这就是与类库相关的了:在Cocoa中,这个单根类是NSObject,而在gcc的实现里则是Object。严格说来,每一个类都应该是NSObject的子类(相比之下,Java应该说,每一个类都必须是Object的子类),因此使用NSObject*类型应该可以指到所有类对象的指针。但是,实际上我们使用的是id类型。这个类型更加简短,更重要的是,id类型是动态类型检查的,相比来说,NSObject*则是静态类型检查。Objective-C里面没有泛型,那么,我们就可以使用id很方便的实现类似泛型的机制了。在Objective-C里面,指向空的指针应该声明为nil,不能是NULL。这两者虽然很相似但并不可以互换。一个普通的C指针可以指向NULL,但是Objective-C的类指针必须指向nil。正如前文所说,Objective-C里面,类也是对象(元类Meta-Class的对象)。nil所对应的类就是Nil。类声明属性和方法在Objective-C里面,属性attributes被称为实例数据instancedata,成员函数memberfunctions被称为方法methods。如果没有特殊说明,在后续文章中,这两组术语都会被混用,大家见谅。C++Objective-CclassFoo{doublex;public:intf(intx);floatg(intx,inty);};intFoo::f(intx){...}floatFoo::g(intx,inty){...}@interfaceFoo:NSObject{doublex;}-(int)f:(int)x;-(float)g:(int)x:(int)y;@end@implementationFoo-(int)f:(int)x{...}-(float)g:(int)x:(int)y{...}@end在C++中,属性和成员函数都在类的花括号块中被声明。方法的实现类似于C语言,只不过需要有作用于指示符(Foo::)来说明这个函数属于哪个类。Objective-C中,属性和方法必须分开声明。属性在花括号中声明,方法要跟在下面。它们的实现要在@implementation块中。这是与C++的主要不同。在Objective-C中,有些方法可以不被暴露在接口中,例如priv

1 / 48
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功