iOS基礎(chǔ)知識(shí)小記

1.swift中遍歷刪除指定的子數(shù)組 ?

func removeElements(from array: [ExtraTagObject]) {
        var tmp = [Int]()
        for (index, item) in emptyTags.enumerated() {
            for tag in array where tag.tagId == item.tagId {
                tmp.append(index)
            }
        }
        emptyTags.removeSubrange(tmp.startIndex ..< tmp.endIndex)
 }

注意startIndex和endIndex的使用含鳞。

2.進(jìn)程間的通信方式?

  • 管道(pipe): 管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng)语稠,而且只能在具有親緣關(guān)系的進(jìn)程間使用包颁。進(jìn)程的親緣關(guān)系通常是父子關(guān)系芜赌。
  • 有名管道(name pipe): 有名管道也是半雙工的通信方式,但是它允許無(wú)親緣關(guān)系進(jìn)程間的通信哼鬓。
  • 信號(hào)量(semophore): 信號(hào)量是一個(gè)計(jì)數(shù)器送浊,可以用來(lái)控制多個(gè)進(jìn)程對(duì)共享資源的訪(fǎng)問(wèn)。他可以作為一種鎖機(jī)制督怜,防止某進(jìn)程正在訪(fǎng)問(wèn)共享資源時(shí)殴瘦,其他進(jìn)程也訪(fǎng)問(wèn)該資源。因此号杠,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線(xiàn)程之間的同步手段蚪腋。
  • 消息隊(duì)列(message queue):消息隊(duì)列是由消息的鏈表丰歌,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少屉凯,管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)立帖。
  • 信號(hào)(singal):信號(hào)是比較復(fù)雜的通信方式,用于通知接受進(jìn)程某個(gè)事件發(fā)生悠砚。
  • 共享內(nèi)存(shared memory): 共享內(nèi)存就是映射一段能被其他進(jìn)程所訪(fǎng)問(wèn)的內(nèi)存晓勇,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪(fǎng)問(wèn)灌旧。共享內(nèi)存是最快的IPC方式宵蕉,它是針對(duì)其他進(jìn)程通信方式運(yùn)行效率低而專(zhuān)門(mén)設(shè)計(jì)的。它往往與其他的通信機(jī)制节榜,如信號(hào)量羡玛,配合使用,來(lái)實(shí)現(xiàn)進(jìn)程間的同步和通信宗苍。
  • 套接字(sokcket): 套接字也是一種進(jìn)程間的通信機(jī)制稼稿,與其他通信機(jī)制不同的是,它可用于不同主機(jī)間的通信讳窟。

3.簡(jiǎn)述socket流程

服務(wù)端先初始化Socket让歼,然后與端口綁定(bind),對(duì)端口進(jìn)行監(jiān)聽(tīng)(listen)丽啡,調(diào)用accept阻塞谋右,等待客戶(hù)端連接。在這時(shí)如果有客戶(hù)端初始化一個(gè)clientSocket补箍,然后連接服務(wù)器改执,如果連接成功,這時(shí)客戶(hù)端與服務(wù)端的連接就建立了坑雅”补遥客戶(hù)端發(fā)送數(shù)據(jù)請(qǐng)求,服務(wù)端接受請(qǐng)求并處理請(qǐng)求裹粤,然后把回應(yīng)數(shù)據(jù)發(fā)送給客戶(hù)端终蒂,客戶(hù)端讀取數(shù)據(jù),最后關(guān)閉連接遥诉,一次交互結(jié)束拇泣。

4.table性能優(yōu)化方面會(huì)主要是卡頓和掉幀,這兩者有什么區(qū)別?
5.什么是NSTagPointString矮锈?
6.imageNamed有什么弊端霉翔,他是什么時(shí)候釋放的?

7.iOS事件傳遞的順序是怎么樣的愕难?
產(chǎn)生觸摸事件 -> UIApplication事件隊(duì)列 -> [UIWindow hitTestEvent:] ->返回合適的view -> [子控件的 hitTestEvent:] -> 返回最合適的view早龟。
其中尋找最合適的view的兩個(gè)重要的方法:hitTest:withEvent:pointInside惫霸。

  • hitTest:withEvent:
    只要事件一傳遞給一個(gè)控件,這個(gè)控件就會(huì)調(diào)用他自己的hitTest: withEvent去尋找并返回能夠響應(yīng)事件的那個(gè)最合適的view葱弟。
    注意 除非是事先攔截壹店,不管子控件是不是最合適的view,系統(tǒng)都要先把事件傳遞給子控件芝加,經(jīng)過(guò)子控件調(diào)用自己的hitTest:withEvent:方法驗(yàn)證后才知道有沒(méi)有更合適的view硅卢。
如果hitTest:withEvent:方法中返回nil,那么調(diào)用該方法控件本身和其子控件都不是最合適的view藏杖,最合適的view是該空間的父控件将塑。
  • 攔截hitTest:withEvent:

    • 因?yàn)閔itTest: withEvent:方法可以返回最合適的view,所以可以通過(guò)重
      寫(xiě)hitTest:withEvent:方法蝌麸,返回指定的view作為最合適的view点寥。
    • 不管點(diǎn)擊哪里,最合適的view都是hitTest:WithEvent:方法中返回的那個(gè)view
    • 通過(guò)重寫(xiě)hitTest: withEvent:可以攔截事件的傳遞過(guò)程来吩,想讓誰(shuí)處理事件就讓誰(shuí)處理事件敢辩。
    • 如果重寫(xiě)window的hitTest:withEvent:方法return nil,那么誰(shuí)都不能處理事件弟疆,窗口也不能處理戚长。
    • 控制器的view和hitTest: WithEvent:方法 return nil 或者 window的hitTest: withEvent:方法返回self,則只能有window才能處理事件怠苔。
  • pointInside:withEvent:
    pointInside:withEvent:方法判斷點(diǎn)在不在當(dāng)前的view上同廉。如果返回YES,代表點(diǎn)在方法調(diào)用者的坐標(biāo)系上柑司;返回NO代表點(diǎn)不在方法調(diào)用者的坐標(biāo)系上迫肖,那么方法調(diào)用者也就不能處理事件。

  • hitTest:withEvent方法的底層會(huì)調(diào)用pointInside:withEvent:判斷點(diǎn)在不在當(dāng)前view的坐標(biāo)系上帜羊。

  • 攔截這個(gè)方法還可以用來(lái)修改button的響應(yīng)熱區(qū)咒程。
    參考文章

8.iOS事件的響應(yīng)鏈順序又是怎么樣的鸠天?

iOS中響應(yīng)者鏈的關(guān)系可以用下圖表示:


響應(yīng)鏈傳遞.png
  • 響應(yīng)者對(duì)象
    能處理事件的對(duì)象讼育,也就是繼承自UIResponder。iOS中只有UIApplication稠集、UIViewController奶段、UIView這三個(gè)對(duì)象能接受并處理事件。

  • 如何判斷上一個(gè)響應(yīng)者

    • 如果當(dāng)前這個(gè)view是控制器的view剥纷,那么控制器就是上一個(gè)響應(yīng)者痹籍。
    • 如果當(dāng)前這個(gè)view不是控制器的view,那么父控件就是上一個(gè)響應(yīng)者晦鞋。
  • 響應(yīng)鏈的傳遞過(guò)程:

    • 1.如果當(dāng)前view是控制器的view蹲缠,那么控制器就是上一個(gè)響應(yīng)者棺克,事件就傳遞就傳遞給控制器;如果當(dāng)前view不是控制器的view线定,那么父視圖就是當(dāng)前view的上一個(gè)響應(yīng)者娜谊,響應(yīng)就傳遞給它的父視圖。
    • 2.視圖層次的最頂級(jí)視圖斤讥,如果也不能處理收到的響應(yīng)事件纱皆,則將時(shí)間傳遞給window對(duì)象進(jìn)行處理。
    • 3.如果window對(duì)象也不加處理芭商,則將響應(yīng)事件或消息傳遞給UIApplication對(duì)象
    • 4.如果UIApplication對(duì)象也不能處理該事件或消息派草,則將其丟棄。
  • 總結(jié): iOS事件處理的整個(gè)大流程分兩步:1.找到最合適的view铛楣,2.將響應(yīng)鏈往上傳遞

    • 1.觸摸屏幕產(chǎn)生觸摸事件后近迁,觸摸事件會(huì)被添加到UIApplication管理的事件隊(duì)列中(即首先接受到事件的是UIApplication)。
    • 2.UIApplication會(huì)從事件隊(duì)列取出最前面的事件簸州,把事件傳遞給應(yīng)用程序的主窗口keyWindow钳踊。keyWindow是指定的用來(lái)接收鍵盤(pán)以及非觸摸類(lèi)的消息,而且程序中每一個(gè)時(shí)刻只能有一個(gè)window是keyWindow.
    • 3.主窗口會(huì)在視圖層次結(jié)構(gòu)找到一個(gè)最合適的視圖來(lái)處理觸摸事件勿侯。(至此拓瞪,第一步已經(jīng)完成)
    • 4.最合適的view會(huì)調(diào)用自己的touches方法處理事件。
    • 5.touches默認(rèn)做法是把事件順著響應(yīng)者鏈條向上拋助琐。

9.iOS開(kāi)發(fā)中的BitCode有什么用祭埂?

Xcode7后,新建項(xiàng)目默認(rèn)就打開(kāi)了bitcode設(shè)置.而且大部分開(kāi)發(fā)者都被這個(gè)突如其來(lái)的bitcode功能給坑過(guò)導(dǎo)致項(xiàng)目編譯失敗,而這些因?yàn)閎itcode而編譯失敗的的項(xiàng)目都有一個(gè)共同點(diǎn),就是鏈接了第三方二進(jìn)制的庫(kù)或者框架,而這些框架或者庫(kù)恰好沒(méi)有包含bitcode的東西(暫且稱(chēng)為東西),從而導(dǎo)致項(xiàng)目編譯不成功.所以每當(dāng)遇到這個(gè)情況時(shí)候大部分人都是直接設(shè)置Xcode關(guān)閉bitcode功能,全部不生成bitcode。

LLVM是目前蘋(píng)果采用的編譯器工具鏈,Bitcode是LLVM編譯器的中間代碼的一種編碼,LLVM的前端可以理解為C/C++/OC/Swift等編程語(yǔ)言,LLVM的后端可以理解為各個(gè)芯片平臺(tái)上的匯編指令或者可執(zhí)行機(jī)器指令數(shù)據(jù),那么,BitCode就是位于這兩者直接的中間碼. LLVM的編譯工作原理是前端負(fù)責(zé)把項(xiàng)目程序源代碼翻譯成Bitcode中間碼,然后再根據(jù)不同目標(biāo)機(jī)器芯片平臺(tái)轉(zhuǎn)換為相應(yīng)的匯編指令以及翻譯為機(jī)器碼.這樣設(shè)計(jì)就可以讓LLVM成為了一個(gè)編譯器架構(gòu),可以輕而易舉的在LLVM架構(gòu)之上發(fā)明新的語(yǔ)言(前端),以及在LLVM架構(gòu)下面支持新的CPU(后端)指令輸出,雖然Bitcode僅僅只是一個(gè)中間碼不能在任何平臺(tái)上運(yùn)行,但是它可以轉(zhuǎn)化為任何被支持的CPU架構(gòu),包括現(xiàn)在還沒(méi)被發(fā)明的CPU架構(gòu),也就是說(shuō)現(xiàn)在打開(kāi)Bitcode功能提交一個(gè)App到應(yīng)用商店,以后如果蘋(píng)果新出了一款手機(jī)并CPU也是全新設(shè)計(jì)的,在蘋(píng)果后臺(tái)服務(wù)器一樣可以從這個(gè)App的Bitcode開(kāi)始編譯轉(zhuǎn)化為新CPU上的可執(zhí)行程序,可供新手機(jī)用戶(hù)下載運(yùn)行這個(gè)App.

LLVM提供了一個(gè)虛擬指令集機(jī)制,它可以翻譯出指定的所支持的處理器架構(gòu)的執(zhí)行代碼(機(jī)器碼).這個(gè)就使得為iOS應(yīng)用程序的編譯開(kāi)發(fā)一個(gè)完全基于LLVM架構(gòu)的工具鏈成為可能.而LLVM的這個(gè)虛擬的通用的指令集可以用很多種表示格式:

  • 叫做IR的文本表示的匯編格式(像匯編語(yǔ)言);
  • 轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)表示的格式(像目標(biāo)代碼),這個(gè)二進(jìn)制格式就是我們所說(shuō)的bitcode.

Bitcode和傳統(tǒng)的可執(zhí)行指令集不同,他維護(hù)的是函數(shù)功能的類(lèi)型和簽名,比如,傳統(tǒng)可執(zhí)行指令集中,一系列(<=8)的布爾值可以壓縮存儲(chǔ)到單個(gè)字節(jié)中,但是在bitcode中他們是各自獨(dú)自表示的.此外,邏輯運(yùn)算操作(比如寄存器清零操作)也由他們對(duì)應(yīng)的邏輯表示方法($R=0);當(dāng)這些BitCode要轉(zhuǎn)換為特定機(jī)器平臺(tái)的指令集時(shí),他可以用經(jīng)過(guò)針對(duì)特定機(jī)器平臺(tái)優(yōu)化過(guò)的匯編指令來(lái)代替:xor eax, eax.(這個(gè)匯編指令同樣是寄存器<eax>清零操作).

蘋(píng)果默認(rèn)要求watchOS和tvOS的App要上傳bitcode? 因?yàn)榘裝itcode上傳到他自己的中心服務(wù)器后,他可以為目標(biāo)安裝App的設(shè)備進(jìn)行優(yōu)化二進(jìn)制,減小安裝包的下載大小,當(dāng)然iOS開(kāi)發(fā)者也可以上傳多個(gè)版本而不是打包到單個(gè)包里,但是這樣會(huì)占用更多的存儲(chǔ)空間. 最重要的是允許蘋(píng)果可以在后臺(tái)服務(wù)器對(duì)應(yīng)用程序進(jìn)行簽名,而不用導(dǎo)出任何密鑰到終端開(kāi)發(fā)者那.

上傳到服務(wù)器的bitcode給蘋(píng)果帶來(lái)更好處是: 以后新設(shè)計(jì)了新指令集的新CPU,可以繼續(xù)從這份bitcode開(kāi)始編譯出新CPU上執(zhí)行的可執(zhí)行文件,以供用戶(hù)下載安裝.
但是bitcode給開(kāi)發(fā)者帶來(lái)的不便之處就是: 沒(méi)用bitcode之前,當(dāng)應(yīng)用程序奔潰后,開(kāi)發(fā)者可以根據(jù)獲取的的奔潰日志再配上上傳到蘋(píng)果服務(wù)器的二進(jìn)制文件的調(diào)試符號(hào)表信息可以還原程序運(yùn)行過(guò)程到奔潰時(shí)后調(diào)用棧信息,對(duì)問(wèn)題進(jìn)行定位排查.但是用了bitcode之后,用戶(hù)安裝的二進(jìn)制不是開(kāi)發(fā)者這邊生成的,而是蘋(píng)果服務(wù)器經(jīng)過(guò)優(yōu)化后生成的,其對(duì)應(yīng)的調(diào)試符號(hào)信息丟失了,也就無(wú)法進(jìn)行前面說(shuō)的還原奔潰現(xiàn)場(chǎng)找原因了.

目前,watchOS和tvOS應(yīng)用發(fā)布必須上傳帶bitcode版本的包.iOS應(yīng)用發(fā)布對(duì)bitcode的要求是可選的,用戶(hù)可以在Xcode的項(xiàng)目設(shè)置中關(guān)閉. 相當(dāng)于在編譯的時(shí)候加一個(gè)標(biāo)記:embed-bitcode-marker(調(diào)試構(gòu)建) embed-bitcode(打包/真機(jī)構(gòu)建).這個(gè)在clang編譯器的參數(shù)是-fembed-bitcode,swift編譯器的參數(shù)是-embed-bitcode.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兵钮,一起剝皮案震驚了整個(gè)濱河市蛆橡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掘譬,老刑警劉巖泰演,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異葱轩,居然都是意外死亡睦焕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)靴拱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)垃喊,“玉大人,你說(shuō)我怎么就攤上這事袜炕”久眨” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵偎窘,是天一觀的道長(zhǎng)乌助。 經(jīng)常有香客問(wèn)我溜在,道長(zhǎng),這世上最難降的妖魔是什么他托? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任炕泳,我火速辦了婚禮,結(jié)果婚禮上上祈,老公的妹妹穿的比我還像新娘培遵。我一直安慰自己,他們只是感情好登刺,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布籽腕。 她就那樣靜靜地躺著,像睡著了一般纸俭。 火紅的嫁衣襯著肌膚如雪皇耗。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,584評(píng)論 1 312
  • 那天揍很,我揣著相機(jī)與錄音郎楼,去河邊找鬼。 笑死窒悔,一個(gè)胖子當(dāng)著我的面吹牛呜袁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播简珠,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼阶界,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了聋庵?” 一聲冷哼從身側(cè)響起膘融,我...
    開(kāi)封第一講書(shū)人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祭玉,沒(méi)想到半個(gè)月后氧映,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脱货,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年岛都,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹭劈。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疗绣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铺韧,到底是詐尸還是另有隱情,我是刑警寧澤缓淹,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布哈打,位于F島的核電站塔逃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏料仗。R本人自食惡果不足惜湾盗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望立轧。 院中可真熱鬧格粪,春花似錦、人聲如沸氛改。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胜卤。三九已至疆导,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間葛躏,已是汗流浹背澈段。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舰攒,地道東北人败富。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像摩窃,于是被迫代替她去往敵國(guó)和親囤耳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361