2015年11月23日 星期一

(CS193p) Developing Applications for IOS 2013 筆記 Lecture1

很久沒碰IOS了,決定重新學起
IOS經典課程 Stanford CS193p Developing Applications for IOS
是史丹佛大學在iTunesU上面的公開課
有完整的課程影片、字幕和投影片pdf檔
但在2014年後的課程都改採用Swift了
所以還是回去看2013的IOS7 in Objective-C
這是我邊看邊寫的筆記,會這著課程的堂數寫


一、IOS系統架構


很快速的介紹系統架構,由下而上分別為4層:

Core OS
Base on Unix Kernel
BFD-based mock
在這個課程不太會用到
Core Services
IOS是基於C寫成的,但是Objective-C是物件導向語言,所以在這裡實現OO的language tools還有Multithreading。另外還有GPS定位等東西
Media
就Media
Cocoa Touch
實現IOS的UI。值得一題的是Cocoa touch是從Mac OS搬過來的,所以也能在Mac OS上使用,而且有30年以上的歷史,比我還老。
這個課程將集中在Media和Cocoa Touch層


二、Platform Components

工具(IDE):Xcode5 (我用的是Xcode7)
語言     :Objective-C
Frameworks: Foundation(Array,Dictionries...), UIKit
設計模式 :MVC 相當重要的觀念,下面會繼續介紹


三、MVC模式


Model View Controller,這個模式關乎於你程式中classes的分類,Class應分為三類:

Model:What of your program. 負責程式的運算、邏輯等
Controller:How your Model is presented to user. 負責Model和View的溝通
View:負責顯示UI

MVC的溝通形式:
1. Controller -> Model / View

Controller 可以直接talk to Model or View


2. Model <-> View
model 和view必須是完全獨立的,絕對不能讓他們直接溝通


3. View -> Controller



A)View可以跟controller溝通,但是View並不清楚它將跟哪個controller溝通。

像是User在View上按下某個Button,然後View將觸發一個Action,這個Action將通知 Controller中的某個target。
(圖示:action是箭,target是靶。按下button後箭射向靶,View所知道的就只有"我發射了Action")

B)Protocol
這是一個物件導項的觀念。View有時候會遇到較複雜的問題,教授在這裡分出3項概念:Will,Should,Did
以一個Scroller View為例:
當User按下螢幕時它會滑動嗎?(Will)
這時後該允許滑動嗎?(Should)
已經滑動到某個點?(Did)
但是View不會知道這些問題的答案,它會把這些問題委派(delegate)給controller,讓controller回答。

C)Data source
Views不該擁有它們所顯示的data,data應存在於Model
所以Controller還有一種委派的形式:Data source
以音樂列表為例:User開啟音樂列表,此時View就會問Controller總共有多少歌?
Controller從Model得知有10,000首,回覆View,View便創造出10,000的空間。
User往下滑,這時View就告訴Controller下滑到哪裡,Controller就以此向Model要資料,像:給我第150條起的10項條目

4. Model -> Controller
A)Notification & KYO(key value object)
model一樣不會直接跟Controller溝通
model的data改變時,會發出一個廣播(broadcast),而controller中的接收器會接收這個廣播,並決定是否要處理。Controller可以收到廣播後立刻向Model要求改變的資料。


四、Objective-C

Paul教授的講解不是從Hello World開始,而是一個紙牌遊戲,這禮拜實作的Class是"Card"。

1. Objective-C 是基於C的,所以C的code在Objective-C上也能執行

2. implementation file & header file
header file: public API 副檔名是.h
implementation file: private API 副檔名是.m

3. Properties
就是實例變數(Instance variable)
每個property都需要有getter和setter,在header宣告完後Objective-C會自動產生setter和getter,IDE上不會顯示出來,但是仍要記得它們的存在。
nonatomic代表不能同時有多個線程(Thread)set這個property
getter=isChosen,因為這邊chosen的getter會自動命名為"chosen",但通常我們在使用boolean時會希望它叫做"isChosen",所以加上這段重新命名
private property可以加在implementation file的 @interface class名()@end 之間

4. @synthesize contents = _contents
代表contents這個property在這裡的名字是"_contents"

5. Automatic reference counting
類似於java的garbage collection但是更為強大。
Objective-C所有物件都存在於heap
Objective-C會自動處理物件的free和allocate
property的修飾詞strong / weak 關乎於IOS如何處理Object的Memory
strong: Objective-C 會在所有指向此物件的strong pointer消失後free掉這個物件
weak: Objective-C 會在所有指向此物件的strong pointer消失後free掉這個物件,並把這個pointer設成nil。(在Objective-C送訊息給nil pointer不會造成crash)
不存在heap中的property不需要strong/weak修飾詞,像是BOOL

6. 初始值
所有的properties的初始值都是0,而pointer的初始值是nil

7. 程式碼翻譯(to Java)
Objective-C      [card.contents isEqualToString:self.contents]
Java             card.contents.equals(this.contents)

Objective-C      for(Card *card in otherCards)
Java             for(Card card : otherCards)

沒有留言:

張貼留言