基礎篇
Objective-C的類可以多重繼承么?可以采用多個協議么?
不可以多重繼承,可以采用多個協議.
objc使用什么機制管理對象內存?
- MRC 手動引用計數
- ARC 自動引用計數,現在通常使用自動引用計數
import 跟#include 又什么區別,@class呢, #import<> 跟 #import””又什么區別?
import是Objective-C導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字,使用#import頭文件會自動只導入一次,不會重復導入,相當於#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,才去查看類的實現文件,可以解決頭文件的相互包含;#import<>用來包含系統的頭文件,#import””用來包含用戶頭文件。
描述一下iOS SDK中如何實現MVC的開發模式
MVC是模型、試圖、控制開發模式,對於iOS SDK,所有的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。所有的用戶數據都是模型層,它應該獨立於視圖。所有的ViewController都是控制層,由它負責控制視圖,訪問模型數據。
淺復制和深復制的區別?
- 淺層復制:只復制指向對象的指針,而不復制引用對象本身。
- 深層復制:復制引用對象本身。
意思就是說我有個A對象,復制一份后得到A_copy對象后,對於淺復制來說,A和A_copy指向的是同一個內存資源,復制的只不過是是一個指針,對象本身資源
還是只有一份,那如果我們對A_copy執行了修改操作,那么發現A引用的對象同樣被修改,這其實違背了我們復制拷貝的一個思想。深復制就好理解了,內存中存在了
兩份獨立對象本身。
category是什么? 擴展一個類的方式用繼承好還是類目好? 為什么?
category是類目.用類目好,因為繼承要滿足A is a B的關系,而類目只需要滿足A has a B的關系,局限性更小,你不用定義子類就能擴展一個類的功能,還能將類的定義分開放在不同的源文件里,用category去重寫類的方法,僅對本category有效,不會影響到其他類與原有類的關系。
延展是什么? 作用是什么?
延展(extension):在自己類的實現文件中添加類目來聲明私有方法。
解釋一下懶漢模式?
懶漢模式,只在用到的時候才去初始化。
也可以理解成延時加載。
我覺得最好也最簡單的一個列子就是tableView中圖片的加載顯示了。
一個延時載,避免內存過高,一個異步加載,避免線程堵塞。
進階篇
@property中有哪些屬性關鍵字?
屬性可以擁有的特質分為四類:
- 原子性—- nonatomic 特質
在默認情況下,由編譯器合成的方法會通過鎖定機制確保其原子性(atomicity)。如果屬性具備 nonatomic 特質,則不使用同步鎖。請注意,盡管沒有名為“atomic”的特質(如果某屬性不具備 nonatomic 特質,那它就是“原子的” ( atomic) ),但是仍然可以在屬性特質中寫明這一點,編譯器不會報錯。若是自己定義存取方法,那么就應該遵從與屬性特質相符的原子性。
-
讀/寫權限—-readwrite(讀寫)、readonly (只讀)
-
內存管理語義—-assign、strong、 weak、copy
方法名—-getter= 、setter=
你經常使用一些第三方庫有哪些?
- AFNetworking
- SDWebImage
- FMDB
- JSONKit
- MJRefresh
- MJExtension
- Masonry
- 友盟,shareSDK等三方庫。
你經常用的設計模式有哪些?
- MVC
- 代理模式
- 觀察者模式
- 單例模式
- 工廠模式
本地存儲有哪些方式?
- 屬性列表(NSUserDefault 或 plist)
- 對象歸檔 (NSKeyedArchiver)
- SQLite
- CoreData
weak屬性需要在dealloc中置nil么?
不需要,在ARC環境無論是強指針還是弱指針都無需在deallco設置為nil,ARC會自動幫我們處理。
@synthesize和@dynamic分別有什么作用?
- @property有兩個對應的詞,一個是@synthesize,一個是@dynamic。如果@synthesize和@dynamic都沒寫,那么默認的就是@syntheszie var = _var;
- @synthesize的語義是如果你沒有手動實現setter方法和getter方法,那么編譯器會自動為你加上這兩個方法。
- @dynamic告訴編譯器,屬性的setter與getter方法由用戶自己實現,不自動生成。
用@property聲明的NSString(或NSArray,NSDictionary)經常使用copy關鍵字,為什么?如果改用strong關鍵字,可能造成什么問題?
- 因為父類指針可以指向子類對象,使用copy的目的是為了讓本對象的屬性不受外界影響,使用copy無論給我傳入是一個可變對象還是不可對象,我本身持有的就是一個不可變的副本.
- 如果我們使用是strong,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那么會影響該屬性.
什么時候會報unrecognized selector的異常?
當該對象上某個方法,而該對象上沒有實現這個方法的時候
使用block時什么情況會發生引用循環,如何解決?
- 只要是一個對象對該block進行了強引用,在block內部有直接使用到該對象。
- 解決方案:__weak id weakSelf = self;
使用系統的某些block api(如UIView的block版本寫動畫時),是否也考慮引用循環問題?
一般不用考慮,因為官方文檔中沒有告訴我們要注意發生強引用,所以推測系統控件一般沒有對這些block進行強引用,所以我們可以不用考慮循環強引用的問題
GCD的隊列(dispatch_queue_t)分哪兩種類型?
串行隊列和並行隊列
如何用GCD同步若干個異步調用?(如根據若干個url異步加載多張圖片,然后在都下載完成后合成一張整圖)
總體上說: 使用 dispatch group,然后 wait forever 等待完成, 或者采取 group notify 來通知回調。
1 |
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); |
以下代碼運行結果如何?
只能輸出1,然后線程主線程死鎖
1 |
- (void)viewDidLoad |
若一個類有實例變量NSString *_foo,調用setValue:forKey:時,可以以foo還是_foo作為key?
都可以
IBOutlet連出來的視圖屬性為什么可以被設置成weak?
因為視圖已經對它有一個強引用了
你單例怎么理解怎么用的?
Singleton Pattern單例設計模式,通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。類只能有一個實例,而且必須從一個為人熟知的訪問點對其進行訪問,比如工廠方法。這個唯一的實例只能通過子類化進行擴展,而且擴展的對象不會破壞客戶端代碼。例如,UIApplication的sharedApplication方法,任何時候都會返回一個當前應用程序的UIApplication實例。
lldb(gdb)常用的調試命令?
最常用就是 : po 對象
什么是謂詞?
謂詞是通過NSPredicate,是通過給定的邏輯條件作為約束條件,完成對數據的篩選。
+(void)load; +(void)initialize; 的區別?
+(void)load; 在程序運行后立即執行。
+(void)initialize; 在類的方法第一次被調時執行.
什么是KVC,什么是KVO?
- kvc:鍵 - 值編碼是一種間接訪問對象的屬性使用字符串來標識屬性,而不是通過調用存取方法,直接或通過實例變量訪問的機制。
- kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
什么時候用delegate,什么時候用Notification?
delegate針對one-to-one關系,並且reciever可以返回值 給sender,notification 可以針對one-to-one/many/none,reciever無法返回值給sender.所以,delegate用於sender希望接受到 reciever的某個功能反饋值,notification用於通知多個object某個事件
block和weak區別?
- __block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數據類型。
- __weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數據類型(int)。
- block對象可以在block中被重新賦值,weak不可以。
frame和bounds有什么不同?
frame指的是:該view在父view坐標系統中的位置和大小。(參照點是父親的坐標系統)bounds指的是:該view在本身坐標系統中 的位置和大小。(參照點是本身坐標系統)
UIView和CALayer有什么不同?
兩者最大的區別是,圖層不會直接渲染到屏幕上,UIView是iOS系統中界面元素的基礎,所有的界面元素都是繼承自它。它本身完全是由CoreAnimation來實現的。它真正的繪圖部分,是由一個CALayer類來管理。UIView本身更像是一個CALayer的管理器。一個UIView上可以有n個CALayer,每個layer顯示一種東西,增強UIView的展現能力。
TCP和UDP的區別?
- TCP:(傳輸控制協議),提供面向連接的、可靠地點對點的通信;
- UDP:(用戶數據報協議),提供非連接的不可靠的點對多點的通信;
- 實際運用中,看程序注重的是哪一方面,是可靠還是快速;
socket連接與http連接
- http連接:短連接。即客戶端向服務端發送一次請求,服務端響應之后,鏈接即會斷掉;
- socket連接:長連接。即客戶端一旦與服務器建立接連,便不會主動斷掉。
HTTP 的post與get區別與聯系,實踐中如何選擇它們?
- get是從服務器上獲取數據,post是向服務器傳送數據。
- 在客戶端,Get方式在通過URL提交數據,數據在URL中可以看到;POST方式,數據放置在HTML HEADER內提交。
- 對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。
- GET方式提交的數據最多只能有1024字節,而POST則沒有此限制。
- 安全性問題。正如在(1)中提到,使用 Get 的時候,參數會顯示在地址欄上,而 Post 不會。所以,如果這些數據是中文數據而且是非敏感數據,那么使用 get;如果用戶輸入的數據不是中文字符而且包含敏感數據,那么還是使用 post為好。
Http定義了與服務器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應着對這個資源的查,改,增,刪4個操作。GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息。
檢查內存管理問題的方式有哪些
- 點擊Xcode頂部菜單中的ProductàAnalyze。這種方法主要可以查看內存泄露,變量未初始化,變量定義后沒有被使用到
- 使用Instrument工具檢查。點擊Xcode頂部菜單中的Product Profile,彈出一個界面,選擇左側的Memory后,再選右側的Leaks。
- 人工檢查
談安卓與蘋果的優缺點
蘋果系統優點是左右流暢,軟件多,界面華麗,圖標統一,很美觀;缺點是系統封閉,不允許用戶過多的個性化設置,而且只能在蘋果手機上用。安卓系統優點是開放,可以自己擴展的東西很多,支持的硬件也多,各個價位的手機都有;缺點就是軟件太雜亂,兼容性有問題,圖標混亂不美觀。iOS的確比android流暢,這僅僅體現在較大軟件切換時,其他差不多流暢,iOS並不能做到完全后台,如果它完全后台估計也不會比安卓流暢多少。反之,如果安卓只是注重單個運行,流暢度也會大大提升,iOS系統更新沒有android那么頻繁,愛體驗的人會選安卓,那些怕煩的會選iOS。iOS的硬件需求選不及android,以至於android機會相對iOS較熱,較費電額。
大神篇
運行時你是怎么理解的?
ObjC Runtime 其實是一個 Runtime 庫,基本上用 C 和匯編寫的,這個庫使得 C 語言有了面向對象的能力(腦中浮現當你喬幫主參觀了施樂帕克的 SmallTalk 之后嘴角一抹淺笑)。這個庫做的事前就是加載類的信息,進行方法的分發和轉發之類的。OC是一種面向runtime(運行時)的語言,也就是說,它會盡可能地把代碼執行的決策從編譯和鏈接的時候,推遲到運行時。這給程序員寫代碼帶來很大的靈活性,比如說你可以把消息轉發給你想要的對象,或者隨意交換一個方法的實現之類的。這就要求runtime能檢測一個對象是否能對一個方法進行響應,然后再把這個方法分發到對應的對象去。
@protocol 和 category 中如何使用 @property
- 在 protocol 中使用 property 只會生成 setter 和 getter 方法聲明,我們使用屬性的目的,是希望遵守我協議的對象能實現該屬性
- category 使用 @property 也是只會生成 setter 和 getter 方法的聲明,如果我們真的需要給 category 增加屬性的實現,需要借助於運行時的兩個函數:
- objc_setAssociatedObject
- objc_getAssociatedObject
runtime如何通過selector找到對應的IMP地址?
每一個類對象中都一個方法列表,方法列表中記錄着方法的名稱,方法實現,以及參數類型,其實selector本質就是方法名稱,通過這個方法名稱就可以在方法列表中找到對應的方法實現.
一個objc對象如何進行內存布局?
- 所有父類的成員變量和自己的成員變量都會存放在該對象所對應的存儲空間中.
- 每一個對象內部都有一個isa指針,指向他的類對象,類對象中存放着本對象的
- 對象方法列表(對象能夠接收的消息列表,保存在它所對應的類對象中)
- 成員變量的列表,
- 屬性列表,
它內部也有一個isa指針指向元對象(meta class),元對象內部存放的是類方法列表,類對象內部還有一個superclass的指針,指向他的父類對象。
另外.....
我的願望是.......
世界和平.........