做網(wǎng)站續(xù)費(fèi)seo概念
Objective-C是非常實(shí)用的語(yǔ)言。它是一個(gè)用C寫(xiě)成很小的運(yùn)行庫(kù),令應(yīng)用程序的尺寸增加很小,和大部分OO系統(tǒng)使用極大的VM執(zhí)行時(shí)間會(huì)取代了整個(gè)系統(tǒng)的運(yùn)作相反。Objective-C寫(xiě)成的程序通常不會(huì)比其原始碼大很多。而其函式庫(kù)(通常沒(méi)附在軟件發(fā)行本)亦和Smalltalk系統(tǒng)要使用極大的內(nèi)存來(lái)開(kāi)啟一個(gè)窗口的情況相反。因此,Objective-C它完全兼容標(biāo)準(zhǔn)C語(yǔ)言(C++對(duì)C語(yǔ)言的兼容僅在于大部分語(yǔ)法上,而在A(yíng)BI(Application Binary Interface)上,還需要使用extern "C"這種顯式聲明來(lái)與C函數(shù)進(jìn)行兼容),而在此基礎(chǔ)上增加了面向?qū)ο缶幊陶Z(yǔ)言的特性以及Smalltalk消息機(jī)制。?[1]?
Objective-C的最初版本并不支持垃圾回收。在當(dāng)時(shí)這是爭(zhēng)論的焦點(diǎn)之一,很多人考慮到Smalltalk回收時(shí)有漫長(zhǎng)的死亡時(shí)間,令整個(gè)系統(tǒng)失去功用。Objective-C為避免此問(wèn)題才不擁有這個(gè)功能。雖然某些第三方版本已加入這個(gè)功能(尤是GNUstep), Apple在其Mac OS X 10.3中仍未引入這個(gè)功能。
雖然Objective-C是C的超集,但它不是C的基本類(lèi)型為第一級(jí)的對(duì)象。
異同
Objective-C同C++的異同:
和C++不同,Objective-C不支持運(yùn)算符重載(它不支持ad-hoc多型)。亦與C++不同,但和Java相同,Objective-C只容許對(duì)象繼承一個(gè)類(lèi)別(不設(shè)多重繼承)。Categories和protocols不但可以提供很多多重繼承的好處,而且沒(méi)有很多缺點(diǎn),例如額外執(zhí)行時(shí)間過(guò)重和二進(jìn)制不兼容。
Objective-C和C++的比較
單一繼承:
和Java、Smalltalk一樣,Objective-C不支持多重繼承,而C++語(yǔ)言支持多重繼承。
動(dòng)態(tài):
Objective-C是動(dòng)態(tài)定型(dynamicaly typed),它的類(lèi)庫(kù)比C++容易操作。Objective-C 在運(yùn)行時(shí)可以允許根據(jù)字符串名字來(lái)訪(fǎng)問(wèn)方法和類(lèi),還可以動(dòng)態(tài)連接和添加類(lèi)。
C++ 跟從面向?qū)ο缶幊汤锏腟imula 67(一種早期OO語(yǔ)言)學(xué)派,而Objecive-C屬于Smalltalk學(xué)派。
在C++里,對(duì)象的靜態(tài)類(lèi)型決定你是否可以發(fā)送消息給它,而對(duì)Objective-C來(lái)說(shuō),由動(dòng)態(tài)類(lèi)型來(lái)決定。Simula 67學(xué)派更安全,因?yàn)榇蟛糠皱e(cuò)誤可以在編譯時(shí)查出。 而Smalltalk學(xué)派更靈活,比如一些Smalltalk 看來(lái)無(wú)誤的程序拿到Simualr67那里就無(wú)法通過(guò)。
從很多方面來(lái)看,C++和Objective-C的差別,與其說(shuō)是技術(shù)上的, 不如說(shuō)是思維方式上的。你是否想更安全而舍棄靈活性?Simular67學(xué)派的支持者稱(chēng)既然程序設(shè)計(jì)出色何必再要靈活性,而 Smalltalk學(xué)派則稱(chēng)為了靈活可以容忍運(yùn)行時(shí)多出錯(cuò)。
優(yōu)缺點(diǎn)
Apple在其Mac OS X?10.3中仍未引入垃圾回收這個(gè)功能。不過(guò)令人欣慰的是在A(yíng)pple發(fā)布的Xcode4中已經(jīng)支持自動(dòng)釋放(不等同于嚴(yán)格意義上的垃圾回收,因?yàn)閮烧邫C(jī)制不同)。在Xcode4中的自動(dòng)釋放,也就是ARC(Automatic Reference Counting)機(jī)制,不需要用戶(hù)手動(dòng)去Release一個(gè)對(duì)象,而是在編譯期間,編譯器會(huì)自動(dòng)幫你添加[NSObject release]。
另一個(gè)問(wèn)題是Objective-C不包括命名空間機(jī)制(namespace mechanism),取而代之的是程序設(shè)計(jì)師必須在其類(lèi)別名稱(chēng)加上前綴,時(shí)常引起沖突。在2004年,在Cocoa編程環(huán)境中,所有Mac OS X類(lèi)和函數(shù)均有“NS”作為前綴,例如NSObject或NSButton,以表明它們屬于Mac OS X核心(使用“NS”是由于這些類(lèi)和函數(shù)在NeXT OpenStep開(kāi)發(fā)時(shí)定下的)。
雖然Objective-C是C的超集,但它不視C的基本型為第一級(jí)的對(duì)象。
由于Objective-C使用動(dòng)態(tài)運(yùn)行時(shí)類(lèi)型,而且所有的方法都是函數(shù)調(diào)用(有時(shí)甚至連系統(tǒng)調(diào)用(syscalls)也如此),很多常見(jiàn)的編譯時(shí)性能優(yōu)化技術(shù)失效(例如:內(nèi)聯(lián)函數(shù)、常數(shù)傳播、交互式優(yōu)化、純量取代與聚集等)。這使得Objetive-C性能劣于類(lèi)似的對(duì)象抽象語(yǔ)言(如C++)。不過(guò)Objective-C擁護(hù)者認(rèn)為既然Objective-C運(yùn)行時(shí)消耗較大,Objective-C本來(lái)就不應(yīng)應(yīng)用于C++或Java常見(jiàn)的底層抽象。
<interface 部分>? 位于.h文件
@interface MyObject : NSObject {int memberVar1; // 實(shí)體變量id memberVar2; }+(return_type) class_method; // 類(lèi)方法-(return_type) instance_method1; // 實(shí)例方法 -(return_type) instance_method2: (int) p1; -(return_type) instance_method3: (int) p1 andPar: (int) p2; @end
注:以上的+號(hào)表示類(lèi)方法,不需要實(shí)例就可以調(diào)用,-號(hào)表示實(shí)例方法,必須要實(shí)例才能對(duì)其進(jìn)行調(diào)用
<implementation 部分> 位于.m文件
@implementation MyObject () <protocol1,protocol2>{int memberVar3; //私有實(shí)體變數(shù) }屬性?? @property(copy) NSString *name; @property(readonly) int age;方法 +(return_type) class_method {.... //method implementation } -(return_type) instance_method1 {.... } -(return_type) instance_method2: (int) p1 {.... } -(return_type) instance_method3: (int) p1 andPar: (int) p2 {.... } @end
Interface區(qū)塊可定義實(shí)體變量,Implementation區(qū)塊也可以定義實(shí)體變量,兩者的差別在于訪(fǎng)問(wèn)權(quán)限的不同,Interface區(qū)塊內(nèi)的實(shí)體變量默認(rèn)權(quán)限為protected,宣告于implementation區(qū)塊的實(shí)體變量則默認(rèn)為private,故在Implementation區(qū)塊定義私有成員更匹配面向?qū)ο笾庋b原則,因?yàn)槿绱祟?lèi)別之私有信息就不需曝露于公開(kāi)interface(.h文件)中
注:以上的() <class1,class2,..>表示當(dāng)前的類(lèi)MyObject遵從協(xié)議protocol1和protocol2,在當(dāng)前類(lèi)MyObject需要重寫(xiě)protocol1,protocol2的方法
<協(xié)議Protocol部分>
@protocol Locking - (void)lock; - (void)unlock; @end ???