2013年1月20日 星期日

Objective-C VS C#

Xcode:開發IDE,像是 Visual Studio 或 Netbeans 或者 ShareDevelop。
Cocoa:函式庫,像是 MFC、.NET、Swing


  • 減號 ( 或加號 )

    C#
  • private void hello(bool ishello)
    {
       //OOXX
    }
    
    Objective-C
    -(void) hello:(BOOL)ishello
    {
       //OOXX
    }
    
    在 Objective-C 中沒有 public 和 private 的概念,可以認為全是 public。
    加號的意思在於其他函數可以調用這個類中的這個函數,而不用創建這個類的實例。

  • 中括號

    中括號可以認為如何調用你剛才寫的方法,通常在 Objective-C裡叫做「消息」。

    C#
      this.hello(true);
    
    Objective-C
      [self hello:YES];
    
  • NS****
    Jobs被Apple公司的CEO史考利趕出Apple後,建立的公司叫 NextStep,後來 Apple 買下 NextStep,就有了後來的 Mac OS X。
    NextStep 除了變身為 Mac OS X 也變成現在 iPod、iPhone、iPad 上的 iOS

    這些開發NextStep的人們比較自戀地把函數庫裡面所有的類都用NextStep的縮寫打頭命名,也就是NS****了。比較常見的比如:
  •   NSLog
      NSString
      NSInteger
      NSURL
      NSImage
    
      NSLog (@"%d",myInt);
    
    NSLog 主要是在 console 裡追蹤使用。

    還有一些其他開頭的類別
    CF:Core Foundation
    CA:Core Admination
    CG:Core Graphics
    UI :User Interface
    等...
      
  • #import
    可以把他認為是 #include。最好使用 #import。
    在 Objective-C中 #import 被當成 #include 指令的改良版本來使用。除此之外,#import確定一個文件只能被導入一次,這使你在遞歸包含中不會出現問題。一般來說,在導入Objective-C頭文件的時候使用#import,包含C頭文件時使用#include。
  • @interface
    C#
      public class Kids : System
      {
       private string kidName="mykid";
       private string kidAge="15";
       private bool isCaughtKid()
        {
        return true;
       }
      }
    
    Objective-C 1. 先寫 kids.h 文件定義這個類
      @interface Kids: NSObject {
        NSString *kidName;
        NSString *kidAge;
      }
       -(BOOL) isCaughtKid:;
      @end
    
    2. 再寫 一個 kids.m 文件實現
      #import 「kids.h」
      @implementation Kids
      -(void) init {
       kidName=@」mykid」;
       kidAge=@」15」;
      }
      -(BOOL) isCaughtKid:{
       return YES;
      }
    @end
    
  • 多個參數的寫法
    ( 方法的數據類型 ) 函數名:( 參數 1 型態 ) 參數 1 數值的名字 參數 2 名稱:( 參數 2 型態 ) 參數 2 值的名稱 ...
    Objective 方法的定義:
      -(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *)
      mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName;
    
    實作函數
      -(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) 
      mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName{
        大兒子 = myOldestKidName;
        二兒子 = mySecondOldestKidName;
        三兒子 = myThirdOldestKidName;
      }
    
    調用的時候
      Kids *myKids = [[Kids alloc] init];
       [myKids setKids: @」張大力」 secondKid: @」張二力」thirdKid: @」張小力」];
    
    C#
      public void setKids( string myOldestKidName, stringmySecondOldestKidName,
      string myThirdOldestKidName)
      {
        ...
      }
    
    C# 調用
      Kids myKids = new Kids();
      myKids.setKids (「張大力」, 「張二力」, 「張小力」);
    
      [[[MyClass alloc] init:[foo bar]] autorelease];
    
    轉換成 C# 或 Java
      MyClass.alloc().init(foo.bar()).autorelease();
    
  • id
    Objective-C 有種叫做 id 的型別,它的運作有時候像是 void*,不過它卻嚴格規定只能用在物件。Objective-C 與 Java 跟 C++ 不一樣,你在呼叫一個物件的 method 時,並不需要知道這個物件的型別。當然這個 method 一定要存在,這稱為 Objective-C 的訊息傳遞。
  • 同一個數組可以保存不同的對象
    比如一個數組 NSArray,這種數組可以保存各種不同的對象,例如:
    myArray
    0:( float ) 234.33f
    1:@"我是個好人"
    2:(NSImage*) 圖片網址
    3:@"我真是個好人"
    以上 Array 裡面包含浮點數、字串、圖片等型態。
  • BOOL,YES,NO
    YES 表示 C# 或 Java 裡的 true,NO 表示 false。
    實際上 YES 是 1,NO 是 0 ,BOOL 本身就是個 char
  • IBOutlet、IBAction
    如果你希望在Interface Builder中能看到這個控件對象,那麼在定義的時候前面加上IBOutlet,在IB裡就能看到這個對象的outlet。
    如果你希望在Interface Builder裡控制某個對象執行某些動作,就在方法前面加上(IBAction)。
  • nilObjective 的 null 
  • 方法的呼叫

    C#
      回傳值 物件.方法(參數1, 參數2 );
      retVal = Object.method( para1, para2 );
    
    Objective-C
      回傳值 [物件 方法 :參數1 :參數2 ...];
      retVal = [Object method :para1 :para2];
    
    Objective-C 內的參數亦可以遞迴呼叫其它方法,將其回傳值當作參數丟進方法內。 C#
      retVal = Object.method( Obj2.method2(), para2 );
    
    Objective-C
      retVal = [Object method :[Obj2 method2] :para2];
    

參考資料:
http://maciku.blogspot.tw/2009/12/iphone-objective-c.html
http://7club.ithome.com.tw/article/10028617/1
http://blog.roodo.com/flowyu/archives/1457515.html
http://www.cncfan.com/html/?106_7980.html

沒有留言:

張貼留言