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