AC week2 筆記

10/13 – iOS architecture , MVC design pattern , Xcode6操作

iOS layers

ios layers

越往上越接近 user,越底越接近OS機器

Cocoa Touch Framworks

  • Address book UI framework (不會教)

  • EventKit UI framework

  • GameKit framework (不會教)

  • iAd framework (不會教)

  • Mapkit framework

  • Message UI framework

  • Notification center framework (推播或通知)

  • PushKit framework – registration for Voip (for 有網路電話註冊的功能,不是推播)

  • Twitter framework

  • UIKit framework (重要)


Cocoa Touch High level features

  • App extensions (手機畫面往下拉)ios8可以加應用程式在裡面 , ios7都是default的程式

  • Handoff (無縫接軌,走到哪畫面或是程式進行到哪都會一樣)

  • Document Picker ( just for iOS ,一個app不能去存取其他的app) The document picker view controller (UIDocumentPickerViewController) grants users access to files outside your application’s sandbox(專屬的box)

  • AirDrop

  • Textkit

  • UIKit Dynamics (動態效果)

  • Multitasking (多工,程式退在背景,但也是會耗電,等 push(等通知,被動)或 pull(要資料,可設多久去要一次資料,主動) )

  • Apple Push Notification Service (要有網路)

等等還有一些請看ppt


Core OS

  • The Core OS layer contains the low-level features that most other technologies are built upon. Even if you do not use these technologies directly in your apps, they are most likely being used by other frameworks. And in situations where you need to explicitly deal with security or communicating with an external hardware accessory (bluetooth…), you do so using the frameworks in this layer.


MVC design pattern

一樣用Stanford CS193 slide 去描述


Frameworks

一個libary,有些social media也有自己的frameworks , ex : FB , twitter , parse…etc

在xcode裡 frameworks有static(黃色),dynamic(白色)

Add frameworks 在 build phases xcode 裡加 link binary with lib


Xcode

  • Bundle ID (base on name and your ID)

第一版會審比較久(1.0),改版後會比較快(2.0)

  • Xcode 有內建 git repo (必勾),若code寫錯,可以回復

" Check in " – 在xcode裡,全選file,按右鍵,選到 source control ->commit all ,即可比對哪個檔案change,哪個檔案有變動,新增或修改

  • Xcode file 裡的 App delegate可放到supporting file 資料夾裡,因為比較不常用到

  • 建立新 folder or file in Xcode

 一開始建立一個single view project in xcode,會有AppDelegate , ViewController ..etc files ,這些原本就有的檔案,無論你之後在Finder裡建一個new folder,把Xcode路徑指向new folder,default的檔案還是會在原來的folder裡,除非你再新建一個全新的檔案在xcode裡(ex :controller),檔案指到新folder路徑下,新檔案才會在new folder裡,應該算是xcode的一個bug.

或是到Xcode 左邊區塊按右鍵新增資料夾,再到右邊的 show the file inspector 裡有個小反灰的資料夾,從這邊去新增資料夾(可選擇相對路徑或絕對路徑)指到跟左邊一樣的存放的路徑,資料夾名稱一樣即可。

  • 一開始xcode storyboard給你的size is universal size,所以你可以把它調成iPhone or iPad size ,在storyboard裡 -> show the file inspector -> disable “use size classes",選擇你要的size。


10/14

 Xcode storyboard DEMO , auto layout , align, segue , navigation controller

  • 可以reset iOS simulator , open iOS simulator -> Reset Content and settings ( 會清空default的狀況,若顯示尺寸不正常可以使用這個看看)

  • StoryBoard 裡看到的畫面跟size,跟simulator有可能不太一樣,所以可以設定simulator出來的 size:

storyboard -> view controller -> show Attribute inspector ->  simulate Metrics -> size -> 4.7″ (for iPhone6)

還有一種方法,就是用auto layout 去下限制去自動變換 size

  • auto layout 設定限制 ,選擇你要設限制的對象,到 storyboard右下角的 pin

去針對四個角,做你想要的限制,把constrain to margins uncheck(不然你會有margins的空間,16 px),設定四個角為0時,再去update frames選items of new constrains->add constrains ,這樣就算對他做了些尺寸上的限制,之後再到右邊的窗口看,限制有無出現。

  • 把限制的格線打開

editor->canvas 裡面有許多顯示的選項

  • 對齊,底下也有個叫 align的選項,可水平或垂直置中….

  • Resolve layout issue : update frames 可以回復你的限制,若限制跑掉的話,update constrain 更新你的限制,clear constrains 可清除你的限制,以上都可針對所選的view或是整個view來做設定。

  • Xcode image : PNG

1X , 2X , 3X 針對不同 size , retina 解析度

iPhone 1X : 343×667  Pix  ,  2X : 343x667x2 Pix


講解OOP , class , object , instance 定義

.h and .m 就是一個object

詳情請看ppt


Segue (轉場) : push(搭配navigation controller , 包含return button可透過storyboard裡面做設定,或是利用寫code來控制,不過執行優先順序code大於storyboard的設定) , modal (搭配view controller , no return button , 但可用unwind方式回到上一頁)

prepareForSegue 常會用到 isKindOfClass 去判斷 destinationSeque 是否有同樣的 class


10/15  segue , 繼承 , property , self , super , class method

StoryBoard segue

modal : 都是給資料輸入時,輸入完就會自動跳回上一頁,但要下程式碼,沒下程式碼就回不去了,或是用 " unwind segue " 的方式來回去。

push : 一定要搭配Navigation controller ,push的 segue就會有回上一頁的選項,但也可hide起來。

繼承 INHERITANCE

Property

@property NSString *firstName;

* is a pointer ,上面的例子是一個字串的指標 NSString * ,指到字串,而不是指到 *firstName 的指標

Self and Super

Self : 自己指到自己的指標,runtime 時會check 。

Super : compile 時會 check。

Class method (+)

Class method (+) 常用在初始化時,也稱為 " factory method " ,不會有 init 字眼,而是 numberWith…很多,請自行去查。


10/16

  • initialize objects

  • Property就會有 setter 跟 getter 跟 iVar,若同時custom setter and getter,iVar的部分你也要自行宣告在@interface裡面,(NSArray or NSDictionary 會改 getter method demo in welcome xcode file)

  • Method

-(void)methodName;
return ;

// 以上的method沒有回傳值,但 method裡也可寫return,可下判斷式,判斷錯誤即 return  , demo in welcome xcode file

Source Control in Xcode

在一開始建立專案時,git repo 需打勾,可以存在 local 本機端,也可存在server side

If you have “M(modify)" or “A(add)" marks in file , you can choose them into source control (press right button,source control,commit select file ,you can add some comment in that )

or grey out marks in your file (還沒存檔)

or you can discard changes in selected file(假如你這版已經改的亂七八糟,已經存檔了,但還沒commit出去,可用這功能,這會讓你回到上一版你commit的地方)

Xcode tool -> show the version editor (可在上面進行版本的比對,local代表現在版本,左邊代表之前的版本)

HW:

  • User key-in 身分證字號,把正確的ID顯示在 simulator

  • 判斷第一個字是否為英文,和第一個字自動變大寫(setter) 找NSString method 和長度判斷是不是十位。

判斷第一個字是否為英文code:

http://stackoverflow.com/questions/16860108/how-to-determine-if-the-first-character-of-a-nsstring-is-a-letter


10/17

  • Objects send and receive messages flow (see ppt pic)

  • Overwrite parent method ( method and argument need are the same)

What happens when you call the following function?

XYZ Person is XYZShoutingPerson parent.

XYZPerson *person = [[XYZPerson alloc] init];

[somePerson saySomething:@”Hi”];

And now?

XYZShoutingPerson *person = [[XYZPerson alloc] init];

[somePerson saySomething:@”Hi”]

// 會叫到父類別的person 因為用 XYZPerson alloc , if use XYZShoutingPerson alloc 就會叫到自己的,取決你用誰去創造實體 alloc (see ppt)

Practices in Xcode files

  • viewDidLoad , viewWillAppear

  • Hide navigation top bar

[self.navigationController setNavigationBarHidden:YES animated:NO];

// 以上程式碼可放在viewDidLoad or viewWillAppear base on your need.

viewDidLoad : 只會load一次,下一次轉場到這頁面,可能就跑掉了

viewWillAppear : 每轉場,都會再load一次。

假如你在storyboard 某個 viewController (push segue) 的 Top Bar(navigation bar) 裡選 inferred,那這個 viewController 的 Top Bar 會follow 你前一個所連接的 controller 裡的Top Bar 設定去跑,一個接連一個,有寫code就會follow code,沒寫code就看你的Top Bar在storyboard是怎麼去設定的。

  • UIBarButtonItem

  • Unwind segue

    -(IBAction)backToMainViewController:(UIStoryboardSegue*) segue {}

(需把以上的 code 放在你想回去那一層裡的controller)

Above practice show in hellowordU xcode file

  • Break point

設置一個break point,可以debug 或是看程式跑的脈絡

A is a " global var " , L is a " local var " , 後面接著就是他的指標指到的記憶體位址,每個下拉式選單可以看到他的可以看到他的繼承關係,show in debug area

continue program execution : 設break point後,程式會停到你設的程式點,若要讓simulator繼續跑就按這鈕

step over : break point 接著跳下一行

step into : into break point 裡的method or…. ,可以看到訊息是怎麼樣去傳遞的

break point 停在哪,那一行就會STOP,不會執行,Stop over 則會跳下一行。

  • Lazy init (需要用到才去呼叫init)

Above practice show in welcome xcode file

  • Enable Zombie Object

有時跑程式跑到一半,會memory leak,有可能是因為它已釋放了記憶體,但你又去呼叫他,但有個方法可以讓你不釋放記憶體。

In Xcode -> Product -> Scheme ->  Edit Scheme -> Run -> Diagnostics -> check enable zombie object

Primitive types

int , float , double…不是一個object , 只是value, default value is  0 , not nil 若是pointer default is nil , 沒指到任何東西

@property double currentValue;

// notice , no pointer in primitive types as property

Create NSString objects

1.NSString *firstString = [[NSString alloc] initWithCString:"Hello World!"

encoding:NSUTF8StringEncoding];                          // -(id)initWithString


2.NSString *secondString = [NSString stringWithCString:"Hello World!"

encoding:NSUTF8StringEncoding];                    // +(id)stringWithstring

上面是用factory method, class NSString 已做掉 alloc and init


3.NSString *thirdString = @"Hello World!";

// Edward say no assign alloc,init ,just point to string(reference) ? 當記憶體不足時,會自動被release ? Brian say 還是有配置記憶體空間給他,各說各話

以上作用都一樣,第三種比較簡潔,因為內部就先做掉了alloc and init

Mutable string?

1.NSString *name = @"John";

name = [name stringByAppendingString:@"ny"];

// returns a new string object

 

NSMutableString *name = [NSMutableString stringWithString:@"John"];

[name appendString:@"ny"];

// same object, but now represents "Johnny"

螢幕快照 2014-10-19 下午4.14.07

NSNumber

  • Use initialization/factory methods (難讀,一長串)

NSNumber *magicNumber = [[NSNumber alloc] initWithInt:42];
  • Literal Syntax (比較好讀的語法)

NSNumber *magicNumber = @42;

直接把 primitive type 轉object

Create Array

  • Use initialization/factory methods (難讀,一長串)

+ (id)arrayWithObject:(id)anObject; factory method

+ (id)arrayWithObjects:(id)firstObject, ...; factory method

- (id)initWithObjects:(id)firstObject, ...; alloc first before you use
  • Literal Syntax (比較好讀的語法)

NSArray *someArray = @[firstObject, secondObject, thirdObject];

以上code已幫我們做掉alloc and init

從Array取值

  • Use objectAtIndex method

[someArray objectAtIndex: i ]

從 i 裡拿出值在Array裡,不過swift已經沒有這個method

  • Literal Syntax

someArray[ i ];

以上都是一樣的方式

NSDictionary ( key-value , key almost is a NSString)

Create Dictionaries

  • Use initialization/factory methods

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:

someObject, @"anObject",

@"Hello, World!", @"helloString",

@42, @"magicNumber",

someValue, @"aValue",

nil];

// value first , then key , factory method again

  • Literal Syntax

NSDictionary *dictionary = @{

@"anObject" : someObject,

@"helloString" : @"Hello, World!",

@"magicNumber" : @42,

@"aValue" : someValue

};

// 先放key在放value最後用大括弧

從Dictionary裡取值

  • Use objectAtIndex method

NSNumber *storedNumber = [dictionary objectForKey:@"magicNumber"];
  • Literal Syntax

NSNumber *storedNumber = dictionary[@"magicNumber"];

 

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s