iOS的系統架構分爲四個層次:核心操做系統層(Core OS layer)、核心服務層(Core Services layer)、媒體層(Media layer)和可觸摸層(Cocoa Touch layer)ios
Core OS : 位於iOS系統架構最下面的一層是核心操做系統層,它包括內存管理、文件系統、電源管理以及一些其餘的操做系統任務。它能夠直接和硬件設備進行交互。
數據庫
Core Services : 第二層是核心服務層,咱們能夠經過它來訪問iOS的一些服務。數組
Media : 第三層是媒體層,經過它咱們能夠在應用程序中使用各類媒體文件,進行音頻與視頻的錄製,圖形的繪製,以及製做基礎的動畫效果。
安全
Cocoa Touch : 最上面一層是可觸摸層,這一層爲咱們的應用程序開發提供了各類有用的框架,而且大部分與用戶界面有關,本質上來講它負責用戶在iOS設備上的觸摸交互操做。網絡
在Cocoa Touch層中的不少技術都是基於Objective-C語言的。Objective-C語言爲iOS提供了像集合、文件管理、網絡操做等支持。像UIKit框架,它爲應用程序提供了各類可視化組件,好比像窗口(Window)、視圖(View)和按鈕組件(UIButton)。Cocoa Touch層中的其餘框架,對咱們在應用程序中的開發來講也是很是有用的,如訪問用戶通訊錄功能框架、獲取照片信息功能的框架、負責加速感應器和三維陀螺儀等硬件支持的框架。
架構
對應用開發者來講,最重要的就是Cocoa Touch框架了。併發
內省:框架
isKindOfClass:kind是種寬泛的要求,只要對象是該類,或者該類子類的實例都返回YES
性能
isMemberOfClass:Member是種嚴格的要求,對象必須是該類的實例動畫
respondsToSelector:實例或者類是否響應某方法;
協議:id後使用<>來表示
id<>的含義:這是一個id,指向咱們不知道的類,但它要對尖括號中定義的這一組方法做出反應;
協議的安全性介於id和靜態類型之間;
Foundation框架爲全部的應用程序提供基本系統服務;
UIKit和其它的框架都是創建在Foundation框架上面的。Foundation框架是用Object-C對Core Foundation框架裏許多特性的封裝。
description:
該方法定義在NSObject協議裏,由於NSObject不是惟一的根類,NSProxy也是聽從NSObject協議的根類,所以不少方法須要放在NSObject協議裏。
兩個地方會用的description方法:
1:NSLog %@,用%@時,description會被髮送給匹配對象;
2:NSString經過返回self來實現description;
objectAtIndex:若是index不在序列中,代碼會崩潰
lastObject、firstObject:若是數組中沒有成員,返回nil,不會崩潰;
sortedArrayUsingSelector:用於NSArray
sortUsingSelector:用於NSMutableArray
這兩個方法的意思是利用指定的selector對array的元素進行排序,因此,selector方法是發送給array元素的;所以array元素必需要能響應selector方法。若是array元素沒有定義這種方法,一個在分類中聲明。
上圖在分類中實現對NSDictionary的排序方法,注意排序方法返回值類型;
上圖是調用排序方法排序;
makeObjectsPerformSelector:這是NSArray和NSSet的方法,相似 for循環,但效率高於for循環;讓數組成員併發執行同一事件;
將string字符串轉換爲array數組
NSArray *array = [Str componentsSeparatedByString:@","];
將array數組轉換爲string字符串
NSString *tempString = [mutableArray componentsJoinedByString:@","];--分隔符
這個類被用於包含原始類型,例如int、float、double、BOOL、enums等。以便於將基本類型做爲對象來處理。
ios6中新增的建立方法:"@()"
NSNumber *three = @3;
NSNumber *underline = @(NSUnderlineStyleSingle);
NSValue能夠包裝任意類型的數據(例如int、float、char、pointer、structures等),目的是爲了使以上數據類型能被加入集合裏(例如NSArray、NSSet)。事實上NSNumber是NSValue的子類。
須要注意的是,有時候將struct包裝起來的好辦法是將它們轉化爲字符串,而後能夠將字符串放入數組,而且能夠在調試器中打印,而後還有方法將字符串轉換爲C struct。(估計是字符串拆分和合並)
NSData是二進制數據
用於表示日期
是對象的無序集合,對象都是惟一的,就算你把相同的對象放進去兩次,他也只會存在惟一一個。
NSSet很便於告訴你集合中是否有什麼,而若是是數組中有1000個元素,數組可能須要二分查找(甚至還須要排序),但NSSet通過hash處理,效率很高。
是對象的有序集合,介於NSSet與數組之間
它是鍵值對的不可變集合,相似哈希表,全部鍵和值都是強存儲的,只有字典在堆中,它們就在。鍵和值顯然都是對象。
字典一般的建立方法是另外一種@語法,@{};
屬性列表的意思是 集合的集合。什麼是集合?也就是NSArray、NSDictionary甚至是NSString、NSData、NSNumber等,這些都是簡單的集合,或者能夠當作集合的葉節點。任何對象圖,只要其中只有數組、字典、字符串等這些簡單的集合,那它就是屬性列表。
爲何定義這個術語?由於IOS中又一系列API將屬性列表做爲參數,但屬性列表只是咱們定義的一個術語,其類型可能用的是id。
是隻做用於屬性列表的類,它是一種共享字典,這甚至在應用程序啓動和退出時仍然持續存在,它就像一個永久的NSDictionary。NSUserDefaults數據庫中存儲的一切都必須是一個屬性列表,不過它並不是一個徹底的數據庫,它很小,性能不是很好,只能將小對象存放在這裏。