iOS 中級面試題

weixin_34208283發表於2019-01-17

非作者原著 來自摘抄

參考文獻

中級面試題

什麼是arc

- 在物件被建立時 retain Count +1 在物件被release時 retain Count-1 當retain 
count為0時 銷燬物件
- 程式中加入autoreleasepool的物件會由系統自動加上autorelease方法 如果該物件引
用計數為0 則銷燬

arc建立是為了什麼

MRC 記憶體管理的缺點
1.當我們要釋放一個堆記憶體時 首先要確定指向這個堆空間的指標都被release(避擴音前
釋放)
2.釋放指標指向的堆空間 首先要確定哪些指標指向同一個堆 這些指標只能釋放一次(MRC
下即誰建立 誰釋放 避免重複釋放)
3.模組化操作時 物件可能被多個模組建立和使用 不能確定最後由誰去釋放
4.多執行緒操作時 不確定哪個執行緒最後使用完畢

assign vs weak, __block vs __weak 區別

assign 適用於基本資料型別 weak適用於NSObject物件 並且是一個弱引用
assign 也可用來修飾物件 為什麼不用 因為被assign修飾的物件在釋放之後 指標的地
址還是存在的 也就是說指標並沒有被置nil 如果後續的記憶體分配中 剛好分配到這塊地
址 程式就會崩潰
weak修飾的物件在釋放之後 指標地址會被置nil 
__block 用來修飾一個變數 這個變數可以在block中被修改
__block 使用__block修飾的變數在block中會被retain(在arc下 mrc不會)
__weak 使用__weak修飾的變數不會在block程式碼塊中被retain
__weak 避免在block出現迴圈引用

__block在arc和非arc下含義一樣嗎

不一樣

在MRC中 __block variable在block中使用時不會retain的
在ARC中 __block則是會Retain的
取而代之的是用__weak或是__unsafe unretained來更精確的描述weak reference的
目的
其中前者只能在ios5之後可以使用 但是比較好

使用nonatomic 一定是執行緒安全的嗎

不是的

atomic原子操作 系統會為setter方法加鎖
nonatomic不會為setter方法加鎖
atomic 執行緒安全 需要消耗大量系統資源來為屬性加鎖
nonatomic 非執行緒安全  適合記憶體較小的移動裝置

+(void)load +(void)initialize 有什麼用處

+load 會在類初始載入時被呼叫
+initialize會在第一次呼叫類方法或例項方法之前被呼叫

為什麼其他語言叫函式呼叫 objective-c裡則是給物件發訊息

動態執行時語言

什麼是method swizzling?

我們可以利用 method_exchangeImplementations 來交換2個方法中的IMP,

我們可以利用 class_replaceMethod 來修改類,

我們可以利用 method_setImplementation 來直接設定某個方法的IMP

UIView CALayer什麼關係

- UIView 主要處理事件  frame bounds  實際上內部是訪問它所含有的CALayer的相
關屬性 
- UIView有一個layer屬性 可以返回它的主CALayer例項 UIView有一個layerClass方
法 返回主layer所使用的類 UIView的子類 可以通過過載這個方法 來讓UIView使用不
同的CALayer來顯示
- UIView的layer樹形在系統內部 被系統維護著三份copy
  1. 邏輯樹 就是程式碼裡可以操縱的 列如更改layer的屬性
  2. 動畫樹 這是一箇中間層 系統正在這一層上更改屬性 進行各種渲染操作
  3. 顯示樹 這個樹的內容就是當前正被顯示在螢幕上的內容
- CALayer 負責繪製

loadView是幹嘛用的

1、如果你用了nib檔案,過載這個方法就沒有太大意義。因為loadView的作用就是載入
nib。如果你過載了這個方法不呼叫super,那麼nib檔案就不會被載入。如果呼叫了
super,那麼view已經載入完了,你需要做的其他事情在viewDidLoad裡面做更合適。
2、如果你沒有用nib,這個方法預設就是建立一個空的view物件。如果你想自己控制
view物件的建立,例如建立一個特殊尺寸的view,那麼可以過載這個方法,自己建立一
個UIView物件,然後指定 self.view = myView; 但這種情況也沒有必要呼叫super,
因為反正你也不需要在super方法裡面建立的view物件。如果呼叫了super,那麼就是浪
費了一些資源而已 

GCD裡面有哪幾種Queue?你自己建立過序列queue嗎?背後的執行緒模型是什麼樣的

1.主佇列 dispatch_main_queue(); 序列 ,更新UI 
2.全域性佇列 dispatch_global_queue(); 並行,四個優先順序:
background,low,default,high 
3.自定義佇列 dispatch_queue_t queue ; 可以自定義是並行:
DISPATCH_QUEUE_CONCURRENT或者序列DISPATCH_QUEUE_SERIAL

http的post和get啥區別?

1.GET請求的資料會附在URL之後(就是把資料放置在HTTP協議頭中),以?分割URL和傳
輸資料,引數之間以&相連,如:login.action?name=hyddd&password=idontknow&
verify=%E4%BD%A0%E5%A5%BD。如果資料是英文字母/數字,原樣傳送,如果是空格,
轉換為+,如果是中文/其他字元,則直接把字串用BASE64加密,得出如:
%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進製表示的ASCII。 
POST把提交的資料則放置在是HTTP包的包體中。

2.”GET方式提交的資料最多隻能是1024位元組,理論上POST沒有限制,可傳較大量的資料
IIS4中最大為80KB,IIS5中為100KB”??!
以上這句是我從其他文章轉過來的,其實這樣說是錯誤的,不準確的:
 (1).首先是”GET方式提交的資料最多隻能是1024位元組”,因為GET是通過URL提交資料,
那麼GET可提交的資料量就跟URL的長度有直接關係了。而實際上,URL不存在引數上限的
問題,HTTP協議規範沒有對URL長度進行限制。這個限制是特定的瀏覽器及伺服器對它的
限制。IE對URL長度的限制是2083位元組(2K+35)。對於其他瀏覽器,如Netscape、
FireFox等,理論上沒有長度限制,其限制取決於作業系統的支援。
注意這是限制是整個URL長度,而不僅僅是你的引數值資料長度。[見參考資料5]
  (2).理論上講,POST是沒有大小限制的,HTTP協議規範也沒有進行大小限制,說
“POST資料量存在80K/100K的大小限制”是不準確的,POST資料是沒有限制的,起限制作
用的是伺服器的處理程式的處理能力。

3.在ASP中,服務端獲取GET請求引數用Request.QueryString,獲取POST請求引數用
Request.Form。在JSP中,用request.getParameter(\”XXXX\”)來獲取,雖然jsp中
也有request.getQueryString()方法,但使用起來比較麻煩,比如:傳一個test.jsp?
name=hyddd&password=hyddd,用request.getQueryString()得到的是:name=
hyddd&password=hyddd。在PHP中,可以用GET和GET和_POST分別獲取GET和POST中的
資料,而REQUEST則可以獲取GET和POST兩種請求中的資料。值得注意的是,JSP中使用
request和PHP中使用REQUEST則可以獲取GET和POST兩種請求中的資料。值得注意的是,
JSP中使用request和PHP中使用_REQUEST都會有隱患,這個下次再寫個文章總結。
4.POST的安全性要比GET的安全性高。注意:這裡所說的安全性和上面GET提到的“安全”
不是同個概念。上面“安全”的含義僅僅是不作資料修改,而這裡安全的含義是真正的
Security的含義,比如:通過GET提交資料,使用者名稱和密碼將明文出現在URL上,因為(1)
登入頁面有可能被瀏覽器快取,(2)其他人檢視瀏覽器的歷史紀錄,那麼別人就可以拿到
你的賬號和密碼了,除此之外,使用GET提交資料還可能會造成Cross-site request 
forgery攻擊。

總結一下,Get是向伺服器發索取資料的一種請求,而Post是向伺服器提交資料的一種
請求,在FORM(表單)中,Method預設為”GET”,實質上,GET和POST只是傳送機制不同
並不是一個取一個發!

相關文章