Objective-C http://MobileDev.TW iOS APP Developer Objective-C 語法入門 Ryan@MobileDev.TW 1
Objective-C http://MobileDev.TW 大綱 1.  Hello Objective-C! Xcode環境認識 2.  Objective-C語法類別、物件與方法 1)  從一個簡單的分數開始 2)  來寫一個計算機 3)  再論類別 3.  繼承的概念 4.  CategoryProtocol 5.  Framework 6.  資料型態 id 7.  星號與初始化 2
Objective-C http://MobileDev.TW 1.HELLO OBJECTIVE-C!XCODE環境認識 3
Objective-C http://MobileDev.TW 步驟1/4 1.  打開Xcode - Create a new Xcode project 4
Objective-C http://MobileDev.TW 步驟2/4 2.OS X-Application,選Command Line Tool,Next 5
Objective-C http://MobileDev.TW Xcode的樣板專案分類 6
Objective-C http://MobileDev.TW 步驟3/4 3.  輸入HelloXcode,Type為foundation (Language:ObjC),Next 7
Objective-C http://MobileDev.TW 步驟4/4 4.  直接Run就可以在output看到Hello, World! 8
Objective-C http://MobileDev.TW 重點理解 1.  main是程式的進入點 2.  @autoreleasepool使用自動記憶體機制進行釋放 3.  利用NSLog來輸出資訊於console 9
Objective-C http://MobileDev.TW What is NSLog? 游標放在NSLog上,按下alt,看到問號後按下滑鼠左鍵 10
Objective-C http://MobileDev.TW 修改NSLog輸出運算結果 11 Format Specifiers http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/ Articles/formatSpecifiers.html
Objective-C http://MobileDev.TW NSLog的描述邏輯 固定的內容直接寫上,變動的部分標上資料類別,然 後排列在後方 12
Objective-C http://MobileDev.TW NSLog Specifier 13
Objective-C http://MobileDev.TW NSLog Specifier 14
Objective-C http://MobileDev.TW NSLog Specifier 15
Objective-C http://MobileDev.TW You should got it NOW •  Xcode可以製作哪些種類的應用程式 •  如何查閱進一步解釋 •  如何跳至匯入程式碼的原始位置 •  如何使用NSLog顯示變數的值 16
Objective-C http://MobileDev.TW 2.OBJECTIVE-C語法:類別、物件與方法 17
Objective-C http://MobileDev.TW 2-1.從一個簡單的分數開始 18
Objective-C http://MobileDev.TW 目前我們透過直接給值來顯示分數 指定固定的分子與分母 19
Objective-C http://MobileDev.TW 顯示一個分數 20 結果
Objective-C http://MobileDev.TW 現在我們希望蓋一間工廠,給它分子 與分母,它就產生分數給我們 類別的初體驗 21
Objective-C http://MobileDev.TW 建立類別 •  建立一個運算分數的類別 •  裡面有分子、分母 •  有輸入分子的方法 •  有輸入分母的方法 •  有輸出結果的方法 22 類別就像是生產工廠的運 作機制,建立了類別,就 可以根據這個類別,創造 出一個個的物件來使用。
Objective-C http://MobileDev.TW 類別宣告 23
Objective-C http://MobileDev.TW 類別方法實作 24
Objective-C http://MobileDev.TW Objective-C 術語小字典:iVar •  實體變數(instance variable) •  簡稱 iVar •  相當於一個類別中的屬性定義 25 就像是一個工廠的儲 存空間。 在設計類別時,需要 思考有哪些東西需要 一個儲存空間,這些 東西會被各個運作部 門所使用。
Objective-C http://MobileDev.TW 物件方法與類別方法 •  物件方法必須使用在實體的物件上 •  物件方法前面是減號,類別方法前面是加號 26
Objective-C http://MobileDev.TW 蓋一間工廠,需要說明有哪些成員、 裡面有哪些機器在運作,然後再實際 把這些機器的運作流程都描述清楚 你給我豬肉,我給你香腸 27
Objective-C http://MobileDev.TW 主程式 28 結果
Objective-C http://MobileDev.TW 開始使用Objective-C最美的部分 [ClassOrInstance method]; 呼叫某個類別或物件的方法,也像是給予該類別或物 件一個訊息: [receiver message]; 29
Objective-C http://MobileDev.TW 2-1-1.撰寫同名的方法存取IVAR 這些方法只是為了取得iVar的值或是寫入iVar的值而存在 30
Objective-C http://MobileDev.TW 2-1-1.撰寫同名的方法存取iVar 31
Objective-C http://MobileDev.TW 撰寫同名的方法存取iVar 32
Objective-C http://MobileDev.TW 撰寫同名的方法存取iVar 33 結果
Objective-C http://MobileDev.TW 2-2.來寫一個計算機! 讓我們一起再蓋一間更完善的工廠吧 34
Objective-C http://MobileDev.TW 2-2.來寫一個計算機! •  建立一個計算機類別,裡面放一個iVar來儲存結果 •  跟結果相關的方法 •  設定結果 •  清除結果 •  取出結果 •  計算用的方法 •  加法 •  減法 •  乘法 •  除法 35
Objective-C http://MobileDev.TW 宣告類別 36
Objective-C http://MobileDev.TW 方法實作 37
Objective-C http://MobileDev.TW 主程式 38 結果
Objective-C http://MobileDev.TW 2-3.再論類別 39
Objective-C http://MobileDev.TW 全部都寫在一起,萬一程式碼很多怎麼辦 拆解類別的宣告與實作,放在不同的檔案中 40
Objective-C http://MobileDev.TW 用檔案來區分用途 •  全部寫在一起難以 管理 •  將每一組interface 與implentation分 開儲存: •  .h檔:類別宣告 •  .m檔:類別方法實作 41 @inerface A:NSObject …. @end @implentation A …. @end @inerface B:NSObject …. @end @implentation B …. @end @inerface C:NSObject …. @end @implentation C …. @end A.h A.m B.h B.m C.h C.m
Objective-C http://MobileDev.TW 2-3-1.類別宣告跟方法實作分開 Fraction.h 42
Objective-C http://MobileDev.TW 類別宣告跟方法實作分開 Fraction.m 43
Objective-C http://MobileDev.TW 類別宣告跟方法實作分開 main.m 44
Objective-C http://MobileDev.TW 2-3-1-1.如何增加檔案? Step1.點選Project,滑鼠右鍵,New File… 45
Objective-C http://MobileDev.TW 如何增加檔案? Step2.決定要製作的檔案類型,再按下Next 46
Objective-C http://MobileDev.TW 如何增加檔案? Step3.決定類別名稱,繼承自誰,然後按下Next 47
Objective-C http://MobileDev.TW 如何增加檔案? Step4.決定儲存位置後,就會產生.h與.m檔,使用時 記得匯入 48 .h:宣告 .m:實作
Objective-C http://MobileDev.TW 2-3-1-2.再論類別與物件 •  設計類別作為模板,用類別來創造實體物件 •  在.h檔中設計類別,放置於@interface與@end中 •  實體變數(instance variables) •  相當於一個類別中的屬性定義 •  方法 •  該類別可以操作的功能 49
Objective-C http://MobileDev.TW 2-3-2.自動產生SETTER與GETTER 每一個iVar如果都要撰寫對應的Setter與Getter,太麻煩了 50
Objective-C http://MobileDev.TW 2-3-2.自動產生Setter與Getter •  在Fraction.h中加入 51 •  在Fraction.m中加入 •  加了這兩句,就會自動產生了 •  Getter:numerator,denominator •  Setter:setNumerator,setDenominator
Objective-C http://MobileDev.TW Lab 試著用上述的方法,並且將原先撰寫的Setter、Gette r方法拿掉,看看是否還能正常運作 52
Objective-C http://MobileDev.TW 2-3-2-1.自動產生Synthesize •  開發環境版本:Xcode4.5+iOS6之後 •  建立@property後,自動產生@synthesize •  自動建立成 @synthesize ivarName=_ivarName; •  在類別中,直接透過 _ivarName或self.ivarName 直接存取 •  在其他運作流程中,用objName.ivarName來存取 53
Objective-C http://MobileDev.TW 2-3-2-2.另一種撰寫方式:點運算子 簡單直覺,比較接近其他語言的撰寫方式 54
Objective-C http://MobileDev.TW Dot Operator:可存可取 [myFraction numerator] is equal to myFraction.numerator 55 [myFraction setNumerator : 1] is equal to myFraction.numerator=1
Objective-C http://MobileDev.TW 點運算子與[ ]混用 [[myAppObject theArray] insertObject:[myAppObject objectToInsert] atIndex:0]; -- [myAppObject.theArray insertObject:[myAppObject objectToInsert] atIndex:0]; [myAppObject setTheArray:aNewArray]; -- myAppObject.theArray = aNewArray; 56
Objective-C http://MobileDev.TW 2-3-2-3.Property與Synthesize •  取代了一般的宣告,並且實作了存取方法 •  實作時使用@synthesize (Xcode4.5後自動產生) 57
Objective-C http://MobileDev.TW 2-3-3.接收多個變數的方法 Objective-C另一個美麗的設計 58
Objective-C http://MobileDev.TW 2-3-3.接收多個變數的方法 宣告 59 實作 主程式使用
Objective-C http://MobileDev.TW 方法的語法 -(void) setMake:(NSString *) aMake andModel:(NSString *) aModel andYear:(int) aYear; 此方法的名稱為:setMake:andModel:andYear: 用C的方法寫長這樣: setMake:andModel:andYear(NSString* aMake,NSString *aModel, int aYear); 缺點:語法複雜 優點:可以看得出來每個變數的用途 方法名稱在Objective-C又稱為選擇器(selector) 60
Objective-C http://MobileDev.TW 2-3-4.SELF關鍵字 在自己的類別中,一個方法想要呼叫另一個方法來幫忙 61
Objective-C http://MobileDev.TW self 關鍵字 •  使用self關鍵字來指定本身這個物件 •  在add方法中使用self來呼叫同物件中的其他方法 62
Objective-C http://MobileDev.TW You should got it NOW •  類別、物件與方法,想想工廠的運作 •  什麼是iVar? iVar的存取方式的進化 •  自己寫同名方法 •  自動產生 •  自動產生Synthesize •  點運算子怎麼用 •  接收多個變數的方法怎麼寫、怎麼用? •  self關鍵字是什麼,什麼時機會用到? 63
Objective-C http://MobileDev.TW 3.繼承的概念 從0開始太累了,借用前人種的樹吧! 64
Objective-C http://MobileDev.TW 3-1.運用繼承再客製化類別 •  設計一個正方形類別 1.  若原先已經有矩形類別,那就繼承它,創一個正方形類別 2.  再增加正方形需要用的屬性與方法 3.  正方形這個類別,可以使用矩形類別中的屬性與方法 65 矩形類別 iVar Ra; iVar Rb; Method R1; Method R2; 正方形類別 : 矩形類別 iVar Ra; iVar Rb; Method R1; Method R2; iVar Sa; iVar Sb; Method S1; Method S2;
Objective-C http://MobileDev.TW 3-2.繼承的運作 •  父類別的所有實體變數與方法,都會成為子類別定 義的一部份。 •  子類別可以直接存取這些方法與實體變數。 •  首先會先確認該變數或方法是否存在目前物件的類 別定義中,若沒有,則會往父類別去尋找。 66
Objective-C http://MobileDev.TW 4.CATEGORY AND PROTOCOL 跨越類別的溝通方式,在對的時間,讓對的人來做對的事 67
Objective-C http://MobileDev.TW 4-1.CATEGORY 只是增加幾個方法,不用勞師動眾生個孩子出來 68
Objective-C http://MobileDev.TW 4-1.Category •  擴充現有類別的定義,不須建立一個新的子類別 69
Objective-C http://MobileDev.TW Category •  例:在NSString加入一個新的方法 70
Objective-C http://MobileDev.TW Category的特性 •  不能增加實體變數,只能增加方法 •  可以覆蓋方法,但是不能使用super •  不用實作所有方法 •  影響範圍包含其所屬的子類別 71
Objective-C http://MobileDev.TW 4-2.協定PROTOCOL 時候未到,沒人知道,託人辦事,規矩要了 72
Objective-C http://MobileDev.TW 4-2協定 Protocol •  類別間分享方法的清單 •  甲方:定義協定(宣告方法) •  乙方:採納協定(實作方法) 73
Objective-C http://MobileDev.TW 4-2-1.定義協定 @protocol 協定名稱 宣告方法 @end 74 例如,在NSObject.h中,定義了NSCopying協定
Objective-C http://MobileDev.TW 4-2-2.採納協定 •  要實作的類別,則稱為遵從(conform)或採納(adopt )該協定 •  在@interface後面加上協定 •  在@interface中不用再宣告協定中的方法,但在實 作區段中必須定義他們 75
Objective-C http://MobileDev.TW You should got it NOW •  Category的使用時機 •  Protocol如何定義 •  Protocol如何遵循 76
Objective-C http://MobileDev.TW 5.FRAMEWORK 原廠給的、外面來的,這些積木幫你省去很多麻煩 77
Objective-C http://MobileDev.TW 5-1.什麼是Framework •  Framework •  泛指能夠簡化開發程序的一堆類別、方法、函數與文 件的集合。 •  Foundation Framework •  提供一切基礎所需的framework,如數字、字串處理 、陣列、dictionary、日期時間、檔案系統等等。 •  Application Kit Framework •  用來開發互動的圖形化應用程式 •  提供文字、選單、工具列、表格等等。 78
Objective-C http://MobileDev.TW 5-2.Cocoa 與 Cocoa Touch •  Cocoa •  Foundation Framework •  Application Kit Framework •  Core Data •  Cocoa Touch •  Foundation Framework •  UIKit Framework •  Game Kit Framework •  iAD Framework •  Map Kit Framework 79
Objective-C http://MobileDev.TW 6.資料型態 ID 有些事情,時候未到,真的沒人知道 80
Objective-C http://MobileDev.TW 資料型態 id 使用id來宣告不確定型態的物件 MyClass *myObject1; id myObject2; 81
Objective-C http://MobileDev.TW id這麼好用,為什麼不全部宣告為id? •  宣告為特定資料形態者,稱之為靜態型別 •  int x=5; •  靜態型別在編譯期間,即會檢查被呼叫的方法,若 無該方法,此時就會提出警告 •  及早防範程式錯誤 •  增加程式的可讀性 82
Objective-C http://MobileDev.TW 7.星號與初始化 很多人常問,大家一起來看看 83
Objective-C http://MobileDev.TW Q1.什麼時候要用*號? •  Objective-C所有的物件都是透過指標的方式來找 到該位址,並進行存取。 •  而沒有使用指標的通常是C語言的原始型別(Primitive type) •  字元 char •  整數 int、short、long •  浮點數 float、double •  布林值 BOOL 84
Objective-C http://MobileDev.TW 在Objectiv-C中可以使用C的基本型別 直接拿來用 85 int someInteger = 42; float someFloatingPointNumber = 3.1415; double someDoublePrecisionFloatingPointNumber = 6.02214199e23; int someInteger = 42; someInteger++; // someInteger == 43 someInteger--; // someInteger == 42 someInteger *= 2; // someInteger == 84 所以也可以用C語言的operator
Objective-C http://MobileDev.TW Objectice-C本身也提供了額外的一些基本型別 •  BOOL •  NSInteger、NSUInteger、CGFloat 86
Objective-C http://MobileDev.TW 用C語言的struct來持有基本型別的值 用NSRange結構來持有一個字串的位置與長度 87 NSString *mainString = @This is a long string; NSRange substringRange = [mainString rangeOfString:@long]; typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; 位置:10 長度:4
Objective-C http://MobileDev.TW 物件也可以用來呈現基本型別的數值 用NSString物件來存放字串 88 NSString *firstString = [[NSString alloc] initWithCString:Hello World! encoding:NSUTF8StringEncoding]; NSString *secondString = [NSString stringWithCString:Hello World! encoding:NSUTF8StringEncoding]; NSString *thirdString = @Hello World!;
Objective-C http://MobileDev.TW 用NSNumber物件來持有各種基本型別的數值 char,double,float,int,long,short,….都可持有 89 NSNumber *magicNumber = [[NSNumber alloc] initWithInt:42]; NSNumber *unsignedNumber = [[NSNumber alloc] initWithUnsignedInt:42u]; NSNumber *longNumber = [[NSNumber alloc] initWithLong:42l]; NSNumber *boolNumber = [[NSNumber alloc] initWithBOOL:YES]; NSNumber *simpleFloat = [NSNumber numberWithFloat:3.14f]; NSNumber *betterDouble = [NSNumber numberWithDouble:3.1415926535]; NSNumber *someChar = [NSNumber numberWithChar:'T']; 也可從物件中取出基本型別的值餵給C語言的型別 int scalarMagic = [magicNumber intValue]; unsigned int scalarUnsigned = [unsignedNumber unsignedIntValue]; long scalarLong = [longNumber longValue]; BOOL scalarBool = [boolNumber boolValue]; float scalarSimpleFloat = [simpleFloat floatValue]; double scalarBetterDouble = [betterDouble doubleValue]; char scalarChar = [someChar charValue];
Objective-C http://MobileDev.TW 用NSNumber物件來持有各種基本型別的數值 90 當然也可從物件中取出基本型別的值, 餵給Objective-C語言的基本型別 NSInteger anInteger = 64; NSUInteger anUnsignedInteger = 100; NSNumber *firstInteger = [[NSNumber alloc] initWithInteger:anInteger]; NSNumber *secondInteger = [NSNumber numberWithUnsignedInteger:anUnsignedInteger]; NSInteger integerCheck = [firstInteger integerValue]; NSUInteger unsignedCheck = [secondInteger unsignedIntegerValue];
Objective-C http://MobileDev.TW Q2.什麼時候要alloc init? •  每一個物件基本上都需要,但是有些類別方法本身 已經包含有配置與初始化,初學者會誤以為沒有做 這個動作。 91
Objective-C http://MobileDev.TW 程式設計基礎 – 使用OBJECTIVE-C 凡事起頭難 92
Objective-C http://MobileDev.TW 變數 •  每一種資料的型態不同,需要的儲存空間也不同 •  常用的資料型態 •  C語言 •  int •  float •  char •  Objective-C語言 •  NSString •  NSInteger •  NSDate 93
Objective-C http://MobileDev.TW 常用的程式邏輯(1)如果 •  請撰寫一小段程式,讓使用者輸入姓名與性別 •  如果使用者是男生,請顯示:你好!XXX •  否則,請顯示:妳好!XXX 94
Objective-C http://MobileDev.TW 常用的程式邏輯(1)如果 95
Objective-C http://MobileDev.TW 常用的程式邏輯(1)如果 •  if…else if…else •  修改範例為: •  請使用者輸入性別:(男生 1 女生 2 不願透露 3) •  男生 – 你好 •  女生 – 妳好 •  不透露 – 哈囉 96
Objective-C http://MobileDev.TW 常用的程式邏輯(2)重複性 •  找到事物重複的規律,讓電腦幫你完成 •  在很久很久以前,有位勇士救了國王的女兒,國王想獎勵他, 就說,你可以提一個願望,我會滿足你。這位勇士對國王說: 我的要求很小,請您拿一個棋盤,在第1個格子裡放1粒米,在第 2個格子裡放2粒米,第3個格子裡放4粒米…. 以此類推,每到下 一個格子就增加一倍。直到將這六十四個格子全部放完。我的 要求就這樣。 國王聽了功臣的要求之後哈哈大笑:你的要求如 此簡單,太小看國王了,再提一個願望,勇士很謙虛地說:謝 謝國王,您能滿足我這個要求我就心滿意足了...... •  請問: •  第64個格子要放幾粒米? •  國王一共要給勇士幾粒米? 97
Objective-C http://MobileDev.TW 常用的程式邏輯(2)重複性 98
Objective-C http://MobileDev.TW 常用的程式邏輯(2)重複性 99

Programming in Objective-C