Objective-C語言概述
Objective-C,是擴(kuò)充C的面向?qū)ο缶幊陶Z言。它主要使用于Mac OS Objective-C,通常寫作ObjC和較少用的Objective C或Obj-C,是在C的基礎(chǔ)上,加入面向?qū)ο筇匦詳U(kuò)充而成的編程語言。目前,Objective-C主要應(yīng)用于Mac OS X和iOS這兩個(gè)NeXTSTEP的衍生系統(tǒng),而在NeXTSTEP和OpenStep中它更是基本語言。
Objective-C語言歷史
1980年代初,布萊德·確斯(Brad Cox)在其公司Stepstone發(fā)明Objective-C,它以一種叫做SmallTalk-80的語言為基礎(chǔ)。Objective-C建立在C語言之上,意味著它是在C語言基礎(chǔ)上添加了擴(kuò)展而創(chuàng)造出來的能夠創(chuàng)建和操作對(duì)象的一門新的程序設(shè)計(jì)語言。
對(duì)Objective-C主要的描述是他1986年出版的《Object-oriented Programming, An Evolutionary Approach》。
1988年,NeXT Software公司獲得了Objective-C語言的授權(quán),并開發(fā)出了Objective-C的語言庫(kù)和一個(gè)名為NEXTSTEP的開發(fā)環(huán)境。
1992年,自由軟件基金會(huì)的GNU開發(fā)環(huán)境增加了對(duì)Objective-C的支持。
1994年,NeXT Computer公司和升陽微系統(tǒng)(Sun Microsystem)聯(lián)合發(fā)布了一個(gè)針對(duì)NEXTSTEP系統(tǒng)的標(biāo)準(zhǔn)典范,名為OPENSTEP。OPENSTEP在自由軟件基金會(huì)的實(shí)現(xiàn)名稱為GNUStep。
1996年12月20日,蘋果公司宣布收購(gòu)NeXT Software公司,NEXTSTEP/OPENSTEP環(huán)境成為蘋果操作系統(tǒng)下一個(gè)主要發(fā)行版本OS X的基礎(chǔ),這個(gè)開發(fā)環(huán)境的該版本被蘋果公司稱為Cocoa。
Objective-C語言優(yōu)缺點(diǎn)
Apple在其Mac OS X 10.3中仍未引入垃圾回收這個(gè)功能。不過令人欣慰的是在Apple發(fā)布的xCode4中已經(jīng)支持自動(dòng)釋放啦,我不敢冒昧地說那是垃圾回收,因?yàn)閮烧邫C(jī)制不同,在xCode4中的自動(dòng)釋放,也就是ARC(Automatic Reference Counting)機(jī)制,是不需要用戶手動(dòng)去Release一個(gè)對(duì)象,而是在編譯期間,編譯器會(huì)自動(dòng)幫你添加那些以前你經(jīng)常寫的[NSObject release]。
另一個(gè)問題是ObjC不包括命名空間機(jī)制(namespace mechanism)。取而代之的是程序設(shè)計(jì)師必須在其類別名稱加上前綴,時(shí)常引致沖突。在2004年,在Cocoa編程環(huán)境中,所有Mac OS X類別和函式均有"NS"作為前綴,例如NSObject或NSButton來清楚分別它們屬于Mac OS X核心;使用"NS"是由于這些類別的名稱在NeXTSTEP開發(fā)時(shí)定下。
雖然Objective-C是C的母集,但它也不視C的基本型別為第一級(jí)的對(duì)象。
和C++不同,Objective-C不支援運(yùn)算子多載(它不支持ad-hoc多型)。亦與C++不同,但和Java相同,Objective-C只容許對(duì)象繼承一個(gè)類別(不設(shè)多重繼承)。Categories和protocols不但可以提供很多多重繼承的好處,而且沒有很多缺點(diǎn),例如額外執(zhí)行時(shí)間過重和二進(jìn)制不兼容。
由于Obj-C使用動(dòng)態(tài)運(yùn)行時(shí)類型,而且所有的方法都是函數(shù)調(diào)用(有時(shí)甚至連系統(tǒng)調(diào)用(syscalls)也如此),很多常見的編譯時(shí)性能優(yōu)化方法都不能應(yīng)用于Obj-C(例如:內(nèi)聯(lián)函數(shù)、常數(shù)傳播、交互式優(yōu)化、純量取代與聚集等)。這使得Obj-C性能劣于類似的對(duì)象抽象語言(如C++)。不過Obj-C擁護(hù)者認(rèn)為既然Obj-C運(yùn)行時(shí)消耗較大,Obj-C本來就不應(yīng)應(yīng)用于C++或Java常見的底層抽象。
Objective-C簡(jiǎn)明教程
前言
◆開始學(xué)習(xí)前,假設(shè)你已經(jīng)具備了一些C語言的基礎(chǔ)知識(shí),包括變量類型、函數(shù)、返回值、以及指針的相關(guān)概念。如果對(duì)這些還不了解,建議首先學(xué)習(xí)譚浩強(qiáng)的《C程序設(shè)計(jì)》。
◆Objective-C,是 C 的衍生體,繼承了所有 C 語言的特性。是有一些例外,但是它們不是繼承于 C 的語言特性本身。
◆nil:在 C/C++ 你或許曾使用過 NULL,而在 Objective-C 中則是 nil。不同之處是你可以傳遞訊息給 nil(例如 [nil message];),這是完全合法的,然而你卻不能對(duì) NULL 如法炮制。
◆BOOL:C 沒有正式的布爾類型,而在 Objective-C 中也不是「真的」有。它是包含在 Foundation classes(基本類別庫(kù))中(即 import NSObject.h;nil 也是包括在這個(gè)標(biāo)頭檔內(nèi))。BOOL 在 Objective-C 中有兩種型態(tài):YES 或 NO,而不是 TRUE 或 FALSE。
◆#import vs #include:就如同你在 hello world 范例中看到的,我們使用了 #import。#import 由 gcc 編譯器支援。我并不建議使用 #include,#import 基本上跟 .h 檔頭尾的 #ifndef #define #endif 相同。許多程式員們都同意,使用這些東西這是十分愚蠢的。無論如何,使用 #import 就對(duì)了。這樣不但可以避免麻煩,而且萬一有一天 gcc 把它拿掉了,將會(huì)有足夠的 Objective-C 程式員可以堅(jiān)持保留它或是將它放回來。偷偷告訴你,Apple 在它們官方的程式碼中也使用了 #import。所以萬一有一天這種事真的發(fā)生,不難預(yù)料 Apple 將會(huì)提供一個(gè)支援 #import 的 gcc 分支版本。
◆ Objective-C 中, method 及 message 這兩個(gè)字是可以互換的。不過 messages 擁有特別的特性,具體區(qū)別在後面介紹。
編譯 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 的預(yù)設(shè)副檔名是 .m
創(chuàng)建 classe
@interface
◆基于 "Programming in Objective-C," Copyright (C) 2004 by Sams Publishing 一書中的范例,并經(jīng)過允許而刊載。
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 的縮寫。因?yàn)樗呀?jīng)改名為 OpenStep,所以這在今天已經(jīng)不是那麼有意義了。
◆繼承(inheritance)以 Class: Parent 表示,就像上面的 Fraction: NSObject。
◆夾在 @interface Class: Parent { .... } 中的稱為 instance variables。
◆沒有設(shè)定存取權(quán)限(protected, public, private)時(shí),預(yù)設(shè)的存取權(quán)限為 protected。設(shè)定權(quán)限的方式將在稍後說明。
◆Instance methods 跟在成員變數(shù)(即 instance variables)後。格式為:scope (returnType) methodName: (parameter1Type) parameter1Name;scope 有class 或 instance 兩種。
◆instance methods 以 - 開頭,class level methods 以 + 開頭。
◆Interface 以一個(gè) @end 作為結(jié)束。
原生的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開發(fā)環(huán)境下默認(rèn)的.m文件內(nèi)容,就是原生的Hello World范例代碼。
小貼士:在 Objective-C 中 #import 和 #include 的區(qū)別?
在 Objective-C 中,#import 被當(dāng)成 #include 指令的改良版本來使用。除此之外,#import 確定一個(gè)文 件只能被導(dǎo)入一次,這使你在遞歸包含中不會(huì)出現(xiàn)問題。使用哪一個(gè)還是由你來決定。一般來說,在導(dǎo)入 Objective-C 頭文件的時(shí)候使用 #import,包含 C 頭文件時(shí)使用 #include。
|