2015年11月24日 星期二

(CS193p) Developing Applications for IOS 2013 筆記 Lecture2 Xcode5

Lecture2 Xcode5

這禮拜繼續講解他的紙牌遊戲

一、 Desk

1. - (void)addCard:(*Card)card atTop:(BOOL)atTop
這個method的名稱為addCard atTop
extra arguments的穿插方式比較特別
注意Objective-C中method名稱不可重複

2. NSMutableArray
NSArray通常不會改變,而MutableArray可以動態加入或刪除物件,類似Java的ArrayList

3. Lasy Instantiation
MutableArray的getter需要覆寫,如果getter中只有return _property,將永遠只return nil,因為MutableArray從來沒有被allocate過。所以應該把getter改成:
- (NSMutableArray *)cards
{
    if(!_cards)
      _cards = [[NSMutableArray alloc] init];
    return _cards;

}

4. 補充unsigned
unsigned修飾詞代表非負數,直接寫unsigned等於unsigned int非負整數

5. Paul教授補充
Q:為什麼不用NSNumber? 
A:因為NSNumber是Object,這裡只是個簡單的local變數,通常需要再多個method間傳遞時才會用Object

二、PlayingCard

繼承自Card,用來製造撲克牌

1. Properties
suit:花色  rank:點數

2. NSUInteger
= unsigned int,在iPhone4(32-bit)和iPhone5(64-bit)上長度不同

3. @
@在Object-C裡面代表Object
而String物件(NSString)需要表達成@""
@[]代表Object Array

4.Override
覆寫contents的getter,return花色和點數的String
覆寫suit的getter,如果suit=nil,return "?"
覆寫suit的setter,只能輸入♠,♥,♣,
注意!同時Override setter和getter時會出現錯誤,一定要在前面加上:
@synthesize myProperty = _myProperty;

5. Class Method
似乎有點像Java的static method,呼叫時是用[MyClass calssMethod]
method前面不是"-",而是"+"
send to class, not send to instance of an Object
use it when you're creating things
Paul在這邊這樣用不是為了效能,是為了可讀性,因為每次使用這些method時都要產生一次String array

三、 PlayingCardDeck

繼承自Deck,只有一個method,目的是初始化52張撲克牌。

1.init method
只能呼叫一次
包含alloc
always return self

2. instancetype
IOS7加入,代表和目前class相同的class type

3. self = [super init]
必須先呼叫super initializer
initializer 不能 initialize時會 return nil,以此來檢查是否有正常initialize

四、Xcode

xcode的基本操作,也是這周的作業,在投影片裡面有很詳細的步驟。




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)