Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Programming in Objective-C

http://MobileDev.TW

Related Books

Free with a 30 day trial from Scribd

See all
  • Be the first to comment

Programming in Objective-C

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

×