NSString 一般都是用Copy 來修飾的,這樣是為了防止數(shù)據(jù)被更改,如果用Strong來修飾的話有可能被數(shù)據(jù)更改。當(dāng)原數(shù)據(jù)是NSMutableString 的話,更改了原數(shù)據(jù),由于Strong是淺copy,只是復(fù)制了地址,所以NSString 也會跟著變,如果是用Copy 修飾的話,就不會有這個問題了,因為它是深拷貝。
Block為什么用Copy修飾呢?因為Block默認(rèn)是放棧里面的,為了避免被提前回收資源,所以用Copy來修飾。
UIView 的事件傳遞
1)事件發(fā)生后,系統(tǒng)會將事件加入到UIApplication的隊列里面,UIApplicaiton取出最前面的事件分發(fā)出去。
2)首先把事件發(fā)給窗口的UIWindow,
3)然后UIWindow再分析哪個View適合響應(yīng)事件。觸摸事件的傳遞是從父控件傳遞到子控件。
4)找到對應(yīng)的View之后就用該View的touch事件去處理觸摸事件。
多線程避免資源的搶奪
1)GCD 的話加?xùn)艡诨蛘咝盘栐?br>
dispatch_semaphore_wait 等待信號釋放,代碼會停在這; dispatch_semaphore_signal 釋放信號。
2)Operation 加Depand
3)Thread 加lock
designated initializer 聽說過嗎?
的確沒聽說過,但是看過,initwithNic。。。之類的,其實系統(tǒng)還有一個initwithCoder 一個從本地資源加載,第二個從序列化的資源里面加載,反正都是一個類的初始化函數(shù)。
UIView 和 CALayer 的區(qū)別
1)UIView 繼承自UIResponse CALayer 繼承自NSObject
2)UIView 是CALayer 的進一步封裝,UIview負(fù)責(zé)響應(yīng)時間管理,CALayer主要負(fù)責(zé)圖形的繪制。
3)UIview里面有個Calayer屬性,UiView 是CAlayer的代理
Frame Bounds 的區(qū)別:
Frame大小是相對它上一級的,參照物是父親
Bounds 大小是絕對的,從0開始。
Static 關(guān)鍵字的作用是什么
用Static修飾局部變量,作用域是這個類文件,然后一直保存在內(nèi)存里面,直到程序結(jié)束
用Extend可以引用其他類的變量。但是Static修飾的變量,則對這個沒用。
block 里面什么時候需要__weak (typeof)self weakSelf = self, 什么時候不用呢?
這個要看self是不是強引用了這個block如果沒有就不用啊哈哈。。。
IOS 編譯發(fā)生了什么?
1)Clang進行預(yù)處理
2)LLVM編譯匯編.0 文件
3)鏈接起 .o文件和庫,產(chǎn)生.out 文件
Clang的任務(wù):預(yù)處理、詞法分析、語法分析、語義分析、靜態(tài)分析、生成中間代碼。
預(yù)處理:以#開頭的代碼預(yù)處理。包括引入的頭文件和自定義宏。
詞法分析:每一個.m源文件的聲明和定義從string轉(zhuǎn)化為特殊的標(biāo)記流。
語法分析:將標(biāo)記流解析成一顆抽象語法樹( abstract syntax tree-AST)。
靜態(tài)分析:包含類型檢查和其他檢查。
中間代碼生成:生成LLVM代碼。
如果兩個分類都定義一樣的方法,那調(diào)用哪一個呢?
答案:看complie那里顯示哪個優(yōu)先,和import沒關(guān)系
is equal == 區(qū)別
== 比較的是指針
is equal 比較的是內(nèi)容(指針一樣,對;如果類名不一樣/有空,錯;內(nèi)容一致,對)