您的位置:华清远见教育科技集团 >> iOS资料 >> iOS开发入门:Objective-C语言简介  
 
iOS开发入门:Objective-C语言简介
分享到:

Objective-C语言概述

Objective-C,是扩充C的面向对象编程语言。它主要使用于Mac OS Objective-C,通常写作ObjC和较少用的Objective C或Obj-C,是在C的基础上,加入面向对象特性扩充而成的编程语言。目前,Objective-C主要应用于Mac OS X和iOS这两个NeXTSTEP的衍生系统,而在NeXTSTEP和OpenStep中它更是基本语言。

Objective-C语言历史

1980年代初,布莱德·确斯(Brad Cox)在其公司Stepstone发明Objective-C,它以一种叫做SmallTalk-80的语言为基础。Objective-C建立在C语言之上,意味着它是在C语言基础上添加了扩展而创造出来的能够创建和操作对象的一门新的程序设计语言。

对Objective-C主要的描述是他1986年出版的《Object-oriented Programming, An Evolutionary Approach》。

1988年,NeXT Software公司获得了Objective-C语言的授权,并开发出了Objective-C的语言库和一个名为NEXTSTEP的开发环境。

1992年,自由软件基金会的GNU开发环境增加了对Objective-C的支持。

1994年,NeXT Computer公司和升阳微系统(Sun Microsystem)联合发布了一个针对NEXTSTEP系统的标准典范,名为OPENSTEP。OPENSTEP在自由软件基金会的实现名称为GNUStep。

1996年12月20日,苹果公司宣布收购NeXT Software公司,NEXTSTEP/OPENSTEP环境成为苹果操作系统下一个主要发行版本OS X的基础,这个开发环境的该版本被苹果公司称为Cocoa。

Objective-C语言优缺点

Apple在其Mac OS X 10.3中仍未引入垃圾回收这个功能。不过令人欣慰的是在Apple发布的xCode4中已经支持自动释放啦,我不敢冒昧地说那是垃圾回收,因为两者机制不同,在xCode4中的自动释放,也就是ARC(Automatic Reference Counting)机制,是不需要用户手动去Release一个对象,而是在编译期间,编译器会自动帮你添加那些以前你经常写的[NSObject release]。

另一个问题是ObjC不包括命名空间机制(namespace mechanism)。取而代之的是程序设计师必须在其类别名称加上前缀,时常引致冲突。在2004年,在Cocoa编程环境中,所有Mac OS X类别和函式均有"NS"作为前缀,例如NSObject或NSButton来清楚分别它们属于Mac OS X核心;使用"NS"是由于这些类别的名称在NeXTSTEP开发时定下。

虽然Objective-C是C的母集,但它也不视C的基本型别为第一级的对象。

和C++不同,Objective-C不支援运算子多载(它不支持ad-hoc多型)。亦与C++不同,但和Java相同,Objective-C只容许对象继承一个类别(不设多重继承)。Categories和protocols不但可以提供很多多重继承的好处,而且没有很多缺点,例如额外执行时间过重和二进制不兼容。

由于Obj-C使用动态运行时类型,而且所有的方法都是函数调用(有时甚至连系统调用(syscalls)也如此),很多常见的编译时性能优化方法都不能应用于Obj-C(例如:内联函数、常数传播、交互式优化、纯量取代与聚集等)。这使得Obj-C性能劣于类似的对象抽象语言(如C++)。不过Obj-C拥护者认为既然Obj-C运行时消耗较大,Obj-C本来就不应应用于C++或Java常见的底层抽象。

Objective-C简明教程

前言

◆开始学习前,假设你已经具备了一些C语言的基础知识,包括变量类型、函数、返回值、以及指针的相关概念。如果对这些还不了解,建议首先学习谭浩强的《C程序设计》。

◆Objective-C,是 C 的衍生体,继承了所有 C 语言的特性。是有一些例外,但是它们不是继承于 C 的语言特性本身。

◆nil:在 C/C++ 你或许曾使用过 NULL,而在 Objective-C 中则是 nil。不同之处是你可以传递讯息给 nil(例如 [nil message];),这是完全合法的,然而你却不能对 NULL 如法炮制。

◆BOOL:C 没有正式的布尔类型,而在 Objective-C 中也不是「真的」有。它是包含在 Foundation classes(基本类别库)中(即 import NSObject.h;nil 也是包括在这个标头档内)。BOOL 在 Objective-C 中有两种型态:YES 或 NO,而不是 TRUE 或 FALSE。

◆#import vs #include:就如同你在 hello world 范例中看到的,我们使用了 #import。#import 由 gcc 编译器支援。我并不建议使用 #include,#import 基本上跟 .h 档头尾的 #ifndef #define #endif 相同。许多程式员们都同意,使用这些东西这是十分愚蠢的。无论如何,使用 #import 就对了。这样不但可以避免麻烦,而且万一有一天 gcc 把它拿掉了,将会有足够的 Objective-C 程式员可以坚持保留它或是将它放回来。偷偷告诉你,Apple 在它们官方的程式码中也使用了 #import。所以万一有一天这种事真的发生,不难预料 Apple 将会提供一个支援 #import 的 gcc 分支版本。

◆ Objective-C 中, method 及 message 这两个字是可以互换的。不过 messages 拥有特别的特性,具体区别在後面介绍。

编译 hello world

1. hello.m
    2.
    3. #import
    4.
    5. int main( int argc, const char *argv[] ) {
    6.
    7. printf( "hello world\n" );
    8.
    9. return 0;
    10.
    11. }

◆输出

hello world

◆ 在 Objective-C 中使用 #import 代替 #include

◆ Objective-C 的预设副档名是 .m

创建 classe

@interface

◆基于 "Programming in Objective-C," Copyright (C) 2004 by Sams Publishing 一书中的范例,并经过允许而刊载。

1. Fraction.h
    2.
    3. #import
    4.
    5. @interface Fraction: NSObject {
    6.
    7. int numerator;
    8.
    9. int denominator;
    10.
    11. }
    12.
    13. -(void) print;
    14.
    15. -(void) setNumerator: (int) n;
    16.
    17. -(void) setDenominator: (int) d;
    18.
    19. -(int) numerator;
    20.
    21. -(int) denominator;
    22.
    23. @end

◆NSObject:NeXTStep Object 的缩写。因为它已经改名为 OpenStep,所以这在今天已经不是那麼有意义了。

◆继承(inheritance)以 Class: Parent 表示,就像上面的 Fraction: NSObject。

◆夹在 @interface Class: Parent { .... } 中的称为 instance variables。

◆没有设定存取权限(protected, public, private)时,预设的存取权限为 protected。设定权限的方式将在稍後说明。

◆Instance methods 跟在成员变数(即 instance variables)後。格式为:scope (returnType) methodName: (parameter1Type) parameter1Name;scope 有class 或 instance 两种。

◆instance methods 以 - 开头,class level methods 以 + 开头。

◆Interface 以一个 @end 作为结束。

原生的Hello World代码

1. #import
    2.
    3. int main (int argc, const char * argv[]) {
    4.
    5. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    6.
    7. // insert code here...
    8.
    9. NSLog(@"Hello, World!");
    10.
    11. [pool drain];
    12.
    13. return 0;
    14.
    15. }

以上是Xcode开发环境下默认的.m文件内容,就是原生的Hello World范例代码。

小贴士:在 Objective-C 中 #import 和 #include 的区别?

在 Objective-C 中,#import 被当成 #include 指令的改良版本来使用。除此之外,#import 确定一个文 件只能被导入一次,这使你在递归包含中不会出现问题。使用哪一个还是由你来决定。一般来说,在导入 Objective-C 头文件的时候使用 #import,包含 C 头文件时使用 #include。

 更多相关文章

·iOS 应用程序开发教程:十、排除故障和检查代码
·iOS 应用程序开发教程:九、实施视图控制器
·iOS 应用程序开发教程:八、让应用程序具有辅助功能
·iOS 应用程序开发教程:七、建立文本栏的委托连接
·iOS 应用程序开发教程:六、为文本栏和标签创建 Outlet