A:爲了不循環引用。weak指明該對象並不負責保持delegate這個對象,delegate這個對象的銷燬由外部控制。strong該對象強引用delegate,外界不能銷燬delegate對象,會致使循環引用。DataSource是關於View的內容的東西包括屬性,數據等等,而Delegate則是一些咱們能夠調用的方法,全是操做。block和代理都能解決對象間交互的問題,block更輕型,更簡單,可以直接訪問上下文,代碼一般在同一個地方,這樣讀代碼也連貫。缺點是容易引發循環引用。delegate更重一些,須要實現接口,它的方法分開來,不少時候須要存儲一些臨時數據,另外相關的代碼須要分離到各處沒有block好讀,其優勢就是它是用weak關鍵字修飾的,不會引發循環引用。面試
A:屬性的本質是@property = ivar+getter+setter,也就是說@property系統會自動生成getter和setter方法。屬性默認的關鍵字包括atomic,nonatomic,@synthesize,@dynamic,getter=getterName,setter=setterName,readwrite,readonly,assign,retain,copy。
@dynamic:表示變量對應的屬性訪問器方法,是動態實現的,你須要在 NSObject 中繼承而來的 +(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定 動態實現的方法或者函數。
@synthesize:若是沒有實現setter和getter,編譯器可以自動實現getter和setter方法。算法
A:針對於當把NSMutableString賦值給NSString的時候,纔會有不一樣,用copy的話NSString的值不會發生變化,用strong則會發生變化,隨着NSMutableString的值變化。若是是賦值是NSString對象,那麼使用copy仍是strong,結果都是同樣的,由於NSString對象根本就不能改變自身的值,他是不可變的。swift
A:若想讓本身寫的對象具備拷貝功能,則須要實現NSCopying協議。若是自定義的對象分爲可變版本和非可變版本,那麼就要同時實現NSCopying和NSMutableCopying協議,不過通常沒什麼必要,實現NSCopying協議就夠了。緩存
A:對於不可變對象,copy操做是淺複製,mutableCopy是深複製。對於不可變對象,mutableCopy不只僅是深複製,返回的對象類型仍是不可變對象類型相應的可變對象的類型。內容複製也就是深拷貝,集合的深複製有兩個方法,能夠用initWithArray:copyItems:將第二個參數設置爲YES便可進行深複製,如:NSDictionary *shallowCopyDict = [NSDictionary alloc]initWithDictionary:someDictionary copyItems:YES];若是用這個方法深複製,集合裏的每一個元素都會收到copyWithZone:消息。若是集合裏的對象遵循NSCopying協議,那麼對象就會深複製到新的集合。若是對象沒有遵循NSCopying協議,而嘗試用這種方法進行深複製則會出錯。copyWithZone:這種拷貝方式只能提供一層內存拷貝,而非真正的深拷貝。第二種方法是將集合進行歸檔解檔,如:NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];安全
A:由於既然有外鏈那麼視圖在xib或者storyboard中確定存在,視圖已經對它有一個強引用了。
——————————————————————————————————————————bash
做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個個人點擊加入羣聊iOS交流羣:789143298 ,無論你是小白仍是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 你們一塊兒交流學習成長!服務器
——————————————————————————————————————————微信
A:nonatomic和atomic的區別在於二者自動生成getter和setter的方法不同,若是你本身寫getter和setter方法,那麼(getter,setter,retain,copy,assign)只起提示做用,寫不寫都同樣。
對於atomic的屬性,系統生成的getter和setter會保證get,set的操做完整性,不受其餘線程影響。好比線程A的getter方法運行到一半,線程B調用了setter,那麼線程A的getter仍是能獲得一個完整的對象。
而nonatomic就沒有這個保證了,因此速度要比atomic快。
不過atomic可不能保證線程安全,若是線程A調用了getter,與此同時線程B和線程C都調了setter,那最後線程Aget到的值,三種都有可能:多是B,C set以前原始的值,也多是B set的值,也多是C set的值。同時這個最終的值,也多是B set的值,也多是C set的值。要保證安全,可使用線程鎖。網絡
A:UICollectionViewLayoutAttributes,UICollectionViewFlowLayout。數據結構
A:難以維護,若是須要改動全局的一個字體,若是是代碼的話就很好辦,pch或頭文件中改動就行了。若是是storyboard中就須要一個一個改動很麻煩。
若是storyboard中scene太多,打開storyboard會比較慢。
錯誤定位比較困難,好多錯誤提示模棱兩可。
A:進程是一個內存中運行的應用程序,好比在Windows系統中,一個運行的exe就是一個進程。
線程是指進程中的一個執行流程。
同步是順序執行,執行完一個再執行下一個。須要等待,協調運行。
異步就是彼此獨立,在等待某事件的過程當中繼續作本身的事,不須要等待這些事件完成後再工做。
並行和併發 是前者至關於三我的同時吃一個饅頭,後者至關於一我的同時吃三個饅頭。
併發性(Concurrence):指兩個或兩個以上的事件或活動在同一時間間隔內發生。併發的實質是一個物理CPU(也能夠多個物理CPU) 在若干道程序之間多路複用,併發性是對有限物理資源強制行使多用戶共享以提升效率。
並行性(parallelism)指兩個或兩個以上事件或活動在同一時刻發生。在多道程序環境下,並行性使多個程序同一時刻可在不一樣CPU上同時執行。
區別:(併發)一個處理器同時處理多個任務和(並行)多個處理器或者是多核的處理器同時處理多個不一樣的任務。
A:NSThread、GCD、NSOperation。
A:1.延遲執行任務函數:dispatch_after(.....)。
2.一次性執行dispatch_once(...)。
3.柵欄函數dispatch_barrier_async/dispatch_barrier_sync。
4.隊列組的使用dispatch_group_t。
5.GCD定時器。
A:dispatch_barrior_async 做用是在並行隊列中,等待前面兩個操做並行操做完成。
A:Coredata,realm,fmdb。
A:
1.當程序第一次運行而且將要顯示窗口的時候執行,在該方法中咱們完成的操做
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
複製代碼
2.程序進入後臺的時候首先執行程序將要取消活躍該方法
- (void)applicationWillResignActive:(UIApplication *)application
複製代碼
3.該方法當應用程序進入後臺的時候調用
- (void)applicationDidEnterBackground:(UIApplication *)application
複製代碼
4.當程序進入將要前臺的時候調用
- (void)applicationWillEnterForeground:(UIApplication *)application
複製代碼
5.應用程序已經變得活躍(應用程序的運行狀態)
- (void)applicationDidBecomeActive:(UIApplication *)application
複製代碼
6.當程序將要退出的時候調用,若是應用程序支持後臺運行,該方法被applicationDidEnterBackground:替換
- (void)applicationWillTerminate:(UIApplication *)application
複製代碼
A:NSCache 是一個容器類,相似於NSDIctionary,經過key-value 形式存儲和查詢值,用於臨時存儲對象。
注意一點它和NSDictionary區別就是,NSCache 中的key沒必要實現copy,NSDictionary中的key必須實現copy。
NSCache中存儲的對象也沒必要實現NSCoding協議,由於畢竟是臨時存儲,相似於內存緩存,程序退出後就被釋放了。
A:好比:
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
複製代碼
A:1.NSLog(@"%@", objectA);這會自動調用objectA的description方法來輸出ObjectA的描述信息.
2.description方法默認返回對象的描述信息(默認實現是返回類名和對象的內存地址)
3.description方法是基類NSObject 所帶的方法,由於其默認實現是返回類名和對象的內存地址, 這樣的話,使用NSLog輸出OC對象,意義就不是很大,由於咱們並不關心對象的內存地址,比較關心的是對象內部的一些成變量的值。所以,會常常重寫description方法,覆蓋description方法的默認實現。
A:經過 retainCount 的機制來決定對象是否須要釋放。 每次 runloop 的時候,都會檢查對象的 retainCount,若是retainCount 爲 0,說明該對象沒有地方須要繼續使用了,能夠釋放掉了。
A:block對象就是一個結構體,裏面有isa指針指向本身的類(global malloc stack),有desc結構體描述block的信息,__forwarding指向本身或堆上本身的地址,若是block對象截獲變量,這些變量也會出如今block結構體中。最重要的block結構體有一個函數指針,指向block代碼塊。block結構體的構造函數的參數,包括函數指針,描述block的結構體,自動截獲的變量(全局變量不用截獲),引用到的__block變量。(__block對象也會轉變成結構體)
block代碼塊在編譯的時候會生成一個函數,函數第一個參數是前面說到的block對象結構體指針。執行block,至關於執行block裏面__forwarding裏面的函數指針。
A:static inline內聯函數:使用它能夠減小函數運行時間,提升程序運行速度。但內聯函數裏不能寫循環,開關語句,並且最好不寫過於冗長的函數。
A:在聲明property時,若是不指定關鍵字,編譯器會爲property生成默認的關鍵字。
對應基本數據類型,默認關鍵字爲atomic,assign,readwrite。
對應對象類型,默認關鍵字爲atomic,strong,readwrite。
A:在block中訪問的外部變量是複製過去的,寫操做不對原變量生效。
A:兩個.h文件互相import了對方形成循環引用。block先聲明(在要傳值的controller裏聲明
typedef void(^MyBlock)(NSString *name);//block的重命名
@property (nonatomic,copy) MyBlock block;//block的聲明),在準備接收值的頁面裏實現block,
secondVC.block = ^void(NSString *name)
{
_label.text = name;
};,誰要傳值就在誰那裏調用self.block(@"lalala");。
A:當咱們在使用微信等工具,點擊掃一掃,就能打開二維碼掃描視圖。在咱們點擊屏幕的時候,iphone OS獲取到了用戶進行了「單擊」這一行爲,操做系統把包含這些點擊事件的信息包裝成UITouch和UIEvent形式的實例,而後找到當前運行的程序,逐級尋找可以響應這個事件的對象,直到沒有響應者響應。這一尋找的過程,被稱做事件的響應鏈。
不一樣的響應者以鏈式方式尋找,AppDelegate->UIApplication->UIWindow->UIViewController->UIView->UIButton。
A:TCP鏈接:手機可以使用聯網功能是由於手機底層實現了TCP/IP協議,可使手機經過無線網絡創建TCP鏈接。TCP協議能夠對上層網絡提供接口,使上層網絡數據的傳輸創建在「無差異」的網絡上。
創建起一個TCP鏈接須要通過「三次握手」:
第一次握手:客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
握手過程當中傳送的包裏不包含數據,三次握手完畢後,客戶端和服務器才正式開始傳送數據。理想狀態下,TCP鏈接一旦創建,在通訊雙方中的任何一方主動關閉鏈接以前,TCP鏈接都將一直被保持下去。斷開鏈接時服務器和客戶端都可主動發起斷開TCP鏈接的請求,斷開過程須要通過「四次握手」。
HTTP鏈接:HTTP協議即超文本傳送協議,是Web聯網的基礎,也是手機聯網經常使用的協議之一,HTTP協議是創建在TCP協議的一種應用。
HTTP鏈接最顯著的特色是客戶端發送的每次請求都須要服務器回送響應,在請求結束後,會主動釋放鏈接。從創建鏈接到關閉鏈接的過程稱爲「一次鏈接」。
1.在HTTP 1.0中,客戶端的每次請求都要求創建一次單獨的鏈接,在處理完本次請求後,會自動釋放鏈接。
2.在HTTP 1.1中則能夠在一次鏈接中處理多個請求,而且多個請求能夠重疊進行,不須要等待一個請求結束後再發送下一個請求。
因爲HTTP在每次請求結束後都會主動釋放鏈接,所以HTTP鏈接是一種短鏈接,要保持客戶端程序的在線狀態,須要不斷地向服務器發起鏈接請求。一般的作法是即時不須要得到任何數據,客戶端也保持每隔一段固定的時間向服務器發送一次「保持鏈接」的請求,服務器在收到該請求後對客戶端進行回覆,代表知道客戶端「在線」。若服務器長時間沒法收到客戶端的請求,則認爲客戶端「下線」,若客戶端長時間沒法收到服務器的回覆,則認爲網絡已經斷開。
A:1.URL Scheme
2.Keychain
3.UIPasteboard
4.UIDocumentInteractionController
5.Local socket
6.AirDrop
7.UIActivityViewController
8.App Groups
——————————————————————————————————————————
你們能夠加入iOS交流羣,羣號:789143298 羣內提供數據結構與算法、底層進階、swift、逆向、底層面試題整合文檔等免費資料,無論你是小白仍是大牛歡迎入駐 ,一塊兒討論技術, 你們一塊兒交流學習成長!