kkbox-ios-dev筆記(六) - 概念/Responder

一些新手常常搞混的東西

bool與BOOL

  • 在 64 位操作系統上,OC 的 BOOL會直接等于定義的stdbool.h里面的bool,其實就是int,但如果在 32 位操作系統上,BOOL就會被定義成是一個char,而BOOLbool,就分別是一個byte或是四個bytes的差別。
  • 所以,在 64 位操作系統上,BOOLbool并沒有區別,但我們不能確定我們寫的代碼只會在這種環境下執行,當然,在其他環境下應該也沒什么影響。

NULL nil Nil NSNull NSNotFound

  • NULL
  • NULL其實并不算是 OC 的東西,而是屬于 C 語言。NULL就是 C 語言當中的空指針,是指向 0 的指針。nilNilNULL可以代替使用,但在語意上,當某個 API 想要傳入某個指針(void *)時,而不是 id 類型時,雖然你可以在這種狀態下也可以傳入 OC 對象指針nil,但是傳入 NULL意義會比較清楚。
  • 總結:idnil(void *)NULL

  • nil
  • 是空的 OC 對象指針,也一樣是指向 0.如果我們創建了一個 OC 對象的變量,當我們不想要使用這個對象的時候,便可以將這個變量指向 nil;我們可以對nil調用任何的 OC 對象,都不會產生問題。
  • NSArrayNSDictionary中使用nil,會被當成是最后一個參數,出現在nil之后的參數都會被忽略。另外在對字典和數組插入nil的時候,程序會崩潰。

  • Nil
  • nil是空的實例,而開頭大寫的Nil則是指空的類。當我們要判斷某個類是不是空的,語意上應該用Nil而不是nil
  • 比較可能的應用場合,就是判斷在新的 iOS 系統上出現的新類,如果無法向下兼容,則執行其他代碼。
Class cls = NSClassFromString(@"Abcdefg");

if (cls != Nil) {
// Do something.
}


  • NSNull
  • NSNull是 OC 對象,在數組和字典中不可以插入nil,但可以通過插入NSNull對象表示沒有東西。
  • 在 JSON 文件里,轉換成 OC 對象時,JSON 里面的 null則會轉變成 NSNull對象。

  • NSNotFound
  • NSNotFound所代表的是找不到這個東西的indexNSNotFound是整數的最大值,通常不會建立這么大的數組。在 64 位操作系統和 32 位操作系統上整數的最大值是不一樣的。如下面這段代碼,在 64 位操作系統下是有問題的:
int x = [@[@1, @2, @3] indexOfObject:@4];

if (x != NSNotFound) {
NSLog(@"Found!");
}

* 該代碼中,`NSNotFound`在 64 位操作系統上整數的最大值,但 `x` 被轉變成 32 位整數的最大值,所以`x`就無法等于`NSNotFound`了。

Responder(響應者)

事件的傳遞

  • 傳遞過程:
  • 硬件把事件傳到我們的 App 中,交由UIApplication對象分配事件
  • UIApplication把事件傳送到key Window中,接著由key Window負責分派事件
  • key Window開始尋找在視圖層次中最上面的控制器與視圖,然后發現在上面的視圖是我們的按鈕
  • 觸發按鈕的點擊事件。(如果沒有事件處理,事件又會回到application上)
  • applicationwindowview,每一層中可以處理事件的對象,都叫做響應者。最終處理事件的對象,叫做第一響應者,而這種事件一層層傳遞的尋找處理事件的鎖鏈,叫做響應者鏈條。

Run loop

  • main.m文件里面的做法:
    • 建立auto-release pool
    • 調用UIApplicationMain,創建UIApplication單利對象
    • 執行run loop
    • 調用UIApplication代理方法

Application

  • 硬件事件會被傳遞到window上,而其他系統事件,包括軟件的開啟和關閉,前臺和后臺等,都有轉發給application的代理方法中。
  • 由于application位于相應者鏈條的最底層,每個視圖與window都不處理的時候,才會對給application處理,所以如果我們希望處理一些會影響整個App行為的事情時,就會由application這一層處理。
  • 通過藍牙耳機或數據線上的按鈕切換歌曲,在 iOS7.1 之前,是通過在application代理方法中實現remoteControlReceivedWithEvent:方法,
- (void)remoteControlReceivedWithEvent:(UIEvent *)theEvent

{
if (theEvent.type == UIEventTypeRemoteControl) {
switch(theEvent.subtype) {
case UIEventSubtypeRemoteControlPlay:
break;
case UIEventSubtypeRemoteControlPause:
break;
case UIEventSubtypeRemoteControlStop:
break;
case UIEventSubtypeRemoteControlTogglePlayPause:
break;
case UIEventSubtypeRemoteControlNextTrack:
break;
case UIEventSubtypeRemoteControlPreviousTrack:
break;
... default:
return;
}
}
}
@end

* 當然,如果想要開始接收來自耳機的事件,還要對`application`單利對象調用`beginReceivingRemoteControlEvents`方法。
* 在 iOS7.1以后,推出來`MPRemoteCommandCenter`這個類。之前想要開始播放,會在`remoteControlReceivedWithEvent:`里面處理`UIEventSubtypeRemoteControlPlay`的狀態。現在會改成向`MPRemoteCommandCenter`要求`playCommand`,然后指定`target/action`,如下:

```swift
[[MPRemoteCommandCenter sharedCommandCenter].playCommand addTarg

et:self action:@selector(play:)];

####Window
* `application`在收到觸控等硬件事件之后,會把事件轉發給`key window`。
* 自己創建一個`window`對象,調用`makeKeyAndOrderFront`方法,顯示該`window`,`makeKeyAndOrderFront`方法不但會讓這個`window`顯現,同時也會使該對象成為`key window`,所有的事件都會往這個`window`送,所以,如果該`wondow`使用完畢,必須對原來的`key window`再調用一次`makeKeyAndOrderFront`,把事件處理的權限交還回去。

####View
* `application`通過`sendEvent:`將事件送到`window`,`window`也一樣通過`sendEvent:`將事件送到`view`上,而`view`里面,則是通過`hitTest:withEvent:`方法,在一層又一層的子視圖中查找應該處理事件的子視圖。

####View Controller
`view Controller`本身也是個相應者,因此也實現了`UIResponder`協議。當觸控事件發生的時候,如果某個控制器的視圖都不處理傳來的事件,那么就會轉向詢問這個視圖的控制器本身是否處理這個事件。

####UITouch
* 起初是個非常單純的對象,頂多只會使用`locationInView:`判斷觸控事件發生在視圖的哪個位置上,用`tapCount`知道觸屏了幾下,用`timestamp`知道觸摸的時間。
* iOS9添加了一些新的接口`coalescedTouchesForTouch`,獲取比往常一輪`run loop`收到一次`touch`對象更快的刷新頻率的觸控事件對象,使反應更靈敏。
* `predictedTouchesForTouch:`預測下一個觸控事件可能出現的位置,讓畫面看起來即時更新。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容