Objective-C特點

  1. 目前好象只有Apple使用Objective-C作爲其支持的語言吧。
  2. 與C++的不同之處有:
    • O-C中所有的類都必須繼承自NSObject。
    • O-C中所有對象都是指針的形式。
    • O-C用self代替this。
    • O-C使用id代替void*。
    • O-C使用nil表示NULL
    • O-Ck只支持單繼承。
    • O-C使用YES/NO表示TRUE/FALSE
    • O-C使用#import代替#include
    • O-C中用消息表示類的方法,並採用[aInstance method:argv]調用形式。
    • O-C支持反射機制
    • O-C支持Dynamic Typing, Dynamic Binding和Dynamic Loading。
  3. 與C++的相同之處有:
    • 與C共享的部分一致。
    • 可以使用assert(BOOL), 一般用NSCParameterAssert(BOOL)代替。
  4. O-C中的命名前綴說明:
    • NS-:NextStep
    • CF-:Core Foundation
    • CA-:Core Animation
    • CG-:Core Graphics
    • UI-:User Interface
  5. O-C中的消息特殊性:
    • 調用消息的類可以不知道如何響應這個消息。如果它不知道如何處理這個消息,它會自動的將這個消息轉給其他的類,比如它的父類。
    • 調用消息的類可以是nil。在C++中,在使用類方法之前,我們都需要檢查對象是否爲空,所以在實現析構函數的時候,常會有如下的代碼,如if (var) { delete var; } 但是在objective c中,我們就可以直接寫[var release]; 即使var == nil, 也不會有問題。
  6. O-C中的函數聲明格式有:
    • -/+ (return type) function_name;
    • -/+ (return type) function_name : (parameter type) parameter;
    • -/+ (return type) function_name : (parameter type) parameter1 otherParameter : (parameter_type) parameter2
    • 以上參數說明:-表示一般函數,+表示靜態函數。otherParameter是參數的別名(第一個參數的別名省略),在函數調用時方便指定。
  7. O-C中的構造/析構函數
    • O-C中的init()/release()對應於C++的構造/析構函數。alloc()/dealloc()也就對應於C++的new和delete,其中的dealloc()由於引用計數的自動調用而不用手動調用。
    • O-C中父類的init()/release()函數需要子類的手動調用。而且每次都必須調用。不同於C++的自動調用。
    • 構造函數(- (id) init)調用形如:CSample* pSample=[CSample alloc] init];其中alloc(+ (id) alloc)是繼承來的static函數,init是繼承來的一般函數,如重寫一般函數時,則相當於C++的覆蓋(不帶參數)或重載(帶參數)。
    • 析構函數(- (void) release)將引用計數減1,當=0時父類的release()會自動調用dealloc(- (void) dealloc);
  8. 當O-C沒有數據成員時,可省略{},建議保留。
  9. 繼承下來的方法,如:-(id) init可以頭文件中省略,建議保留
  10. 0-C中只有數據成員的訪問限制,沒有方法的訪問限制。
    • 同C++一樣,數據成員有三種訪問限制public, protected, private,缺省是protected。
      示例:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      @interface AccessExample: NSObject {
      @public
          int publicVar;
      @protected
          int protectedVar;
      @private
          int privateVar;
      }
      @end
    • 方法的訪問限制可通過Category實現
      示例:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      @interface MyClass
      - (void) sayHello {
          NSLog(@"Hello");
      }
      @end
       
      @interface MyClass(Private)
      - (void) kissGoodbye;
      @end
  11. O-C中沒有類的靜態變量,只有全局變量
  12. O-C中的數組NSArray可以保存不同類型的數據。
  13. O-C也支持run-time時的類類型檢查
    • - (BOOL) isKindOfClass: classObj
      用於判斷該對象是否屬於某個類或者它的子類
    • - (BOOL) isMemberOfClass: classObj
      用於判斷該對象是否屬於某個類(這裏不包括子類)
    • - (BOOL) respondsToSelector: selector
      用於判斷該對象是否能響應某個消息。這裏,我們可以將@selector後面帶的參數理解爲C++中的函數指針。
      注意:
      1)不要忘了@
      2)@selector後面用的是(),而不是[]。
      3)要在消息名稱後面跟:,無論這個消息是否帶參數。如:[pSquare respondsToSelector:@selector(Set: andHeight:)]。
    • + (BOOL) instancesRespondToSelector: selector
      用於判斷該類是否能響應某個消息。這是一個靜態函數。
    • -(id) performSelector: selector :調用對象的selector方法。
    • conformsToProtocol 類似於respondsToSelector ,用於動態檢查某個對象是否遵守某個協議。
  14. Category:在沒有源代碼的情況下,爲一個已經存在的類添加一些新的功能
    • 只能添加新的方法,不能添加新的數據成員
    • Category 的名字必須是唯一的
  15. Protocol:相當於C++中的純虛類
    • 形如:@interface MyDate: NSObject <Printing> { } @end
    • 使用:MyDate * dat = [[MyDate alloc] init]; id<Printing> var = dat; [var print]。
    • 說明:我們首先聲明瞭Printing 協議,任何遵守這個協議的類,都必須實現print 方法。在Objective C 中,我們通過<>來表示遵守某個協議。當某個類聲明要遵守某個協議之後,它就必須在.m文件中實現這個協議中的所有方法。使用id<Printing> 作爲類型,而不是象C++中的Printing* var。
  16. IBOutlet, IBAction: 這兩個東西其實在語法中沒有太大的作用。如果你希望在Interface Builder中能看到這個控件對象,那麼在定義的時候前面加上IBOutlet,在IB裏就能看到這個對象的outlet,如果你希望在Interface Builder裏控制某個對象執行某些動作,就在方法前面加上(IBAction)。
  17. 儘量避免在一行語句中進行兩層以上的嵌套
  18. 消息轉發:- (void) forwardInvocation: (NSInvocation*)anInvocation;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章