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