首页 Objective-C 从 C++ 到 Objective-C(2):语法概述

从 C++ 到 Objective-C(2):语法概述

2 1.7K

关键字

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-C 2.0 又增加了@optional,@required,@property,@dynamic,@synthesize这几个。

另外的一些值同样也类似于关键字,有nilNil, 类型id,SELBOOL, 布尔变量YESNO。最后,特定上下文中会有一些关键字,分别是:in,out,inout,bycopy,byref,onewaygetter,setter,readwrite,readonly,assign,retain,copy,nonatomic等。

很多继承自NSObject的函数很容易与关键字混淆。比如alloc,releaseautorelease等。这些实际都是NSObject的函数。另外一个需要注意的是selfsuperself实际上是每一个函数的隐藏参数,而super是告知编译器使用self的另外语义。

注释

Objective-C 使用 // 和 /*…*/ 两种注释风格。

变量声明的位置

Objective-C 允许在代码块的中部声明变量,而不仅仅在块的最开始处。

新增的值和变量

BOOL,YES,NO

C++ 中使用bool表示布尔类型。Objective-C 中则是使用BOOL,其值为YESNO

nil,Nilid

简单来说:

  • 每一个对象都是id类型的。该类型可以作为一种弱类型使用。id是一个指针,所以在使用时应注意是否需要再加 *。例如id *foo = nil,实际是定义一个指针的指针;
  • nil等价于指向对象的NULL指针。nilNULL不应该被混用。实际上,nil并不简单是NULL指针;
  • Nil等价于指针nil的类。在 Objective-C 中,一个类也是一个对象(作为元类 Meta-Class 的实例)。nil代表NULL指针,但它也是一个类的对象,nil就是Nil类的实例。C++ 没有对应的概念,不过,如果你熟悉 Java 的话,应该知道每一个类对象都对应一个Class实例,类似这个。

SEL

SEL用于存储选择器 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++

// 头文件
// In file Foo.h
#ifndef __FOO_H__ //compilation guard
#define __FOO_H__ //
class Foo
{
...
};
#endif

// 源文件
//In file Foo.cpp
#include "Foo.h"
...

Objective-C

// 头文件
//In file Foo.h
//class declaration, different from
//the "interface" Java keyword
@interface Foo : NSObject
{
...
}
@end

// 源文件
//In file Foo.m
#import "Foo.h"
@implementation Foo
...
@end

NS 前缀

我们前面看到的类NSObjectNSString都有一个前缀 NS。这是 Cocoa 框架的前缀(Cocoa 开发公司是 NeXTStep)。

函数和方法的区别

Objective-C 并不是“使用方括号表示函数调用”的语言。一开始很容易把

[object doSomething];

理解成

object.doSomething();

但实际上并不是这么简单。Objective-C 是 C 语言的超集,因此,函数和 C 语言的声明、定义、调用是一致的。C 语言并没有方法这一概念,因此方法是使用特殊语法,也就是方括号。不仅仅是语法上的,语义上也是不同的:这并不是方法调用,而是发送一条消息。看上去并没有什么区别,实际上,这是 Objective-C 的强大之处。例如,这种语法允许你在运行时动态添加方法。

2 评论

Rex 2011年9月25日 - 23:14

是你自己翻译的吗?非常好的学习材料,辛苦了!

回复
DevBean 2011年9月26日 - 17:39

学习的时候自己翻译的,见笑~

回复

回复 Rex 取消回复

关于我

devbean

devbean

豆子,生于山东,定居南京。毕业于山东大学软件工程专业。软件工程师,主要关注于 Qt、Angular 等界面技术。

主题 Salodad 由 PenciDesign 提供 | 静态文件存储由又拍云存储提供 | 苏ICP备13027999号-2