1.為什么代理要用weak慰枕?代理的delegate和dataSource有什么區(qū)別?block和代理的區(qū)別?
A:為了避免循環(huán)引用。weak指明該對象并不負(fù)責(zé)保持delegate這個對象,delegate這個對象的銷毀由外部控制以政。strong該對象強引用delegate,外界不能銷毀delegate對象伴找,會導(dǎo)致循環(huán)引用盈蛮。DataSource是關(guān)于View的內(nèi)容的東西包括屬性,數(shù)據(jù)等等技矮,而Delegate則是一些我們可以調(diào)用的方法抖誉,全是操作殊轴。block和代理都能解決對象間交互的問題,block更輕型寸五,更簡單,能夠直接訪問上下文耿币,代碼通常在同一個地方梳杏,這樣讀代碼也連貫。缺點是容易引起循環(huán)引用淹接。delegate更重一些十性,需要實現(xiàn)接口,它的方法分開來塑悼,很多時候需要存儲一些臨時數(shù)據(jù)劲适,另外相關(guān)的代碼需要分離到各處沒有block好讀,其優(yōu)點就是它是用weak關(guān)鍵字修飾的厢蒜,不會引起循環(huán)引用霞势。
2.屬性的實質(zhì)是什么?包括哪幾個部分斑鸦?屬性默認(rèn)的關(guān)鍵字都有哪些愕贡?@dynamic關(guān)鍵字和@synthesize關(guān)鍵字是用來做什么的?
A:屬性的本質(zhì)是@property = ivar+getter+setter,也就是說@property系統(tǒng)會自動生成getter和setter方法巷屿。屬性默認(rèn)的關(guān)鍵字包括atomic固以,nonatomic,@synthesize嘱巾,@dynamic憨琳,getter=getterName,setter=setterName旬昭,readwrite篙螟,readonly,assign问拘,retain闲擦,copy。
@dynamic:表示變量對應(yīng)的屬性訪問器方法场梆,是動態(tài)實現(xiàn)的墅冷,你需要在 NSObject 中繼承而來的 +(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定 動態(tài)實現(xiàn)的方法或者函數(shù)。
@synthesize:如果沒有實現(xiàn)setter和getter或油,編譯器能夠自動實現(xiàn)getter和setter方法寞忿。
3.NSString為什么要用copy關(guān)鍵字,如果用strong會有什么問題顶岸?(注意:這里沒有說用strong就一定不行腔彰。使用copy和strong是看情況而定的)
A:針對于當(dāng)把NSMutableString賦值給NSString的時候叫编,才會有不同,用copy的話NSString的值不會發(fā)生變化霹抛,用strong則會發(fā)生變化搓逾,隨著NSMutableString的值變化。如果是賦值是NSString對象杯拐,那么使用copy還是strong霞篡,結(jié)果都是一樣的,因為NSString對象根本就不能改變自身的值端逼,他是不可變的朗兵。
4.如何令自己所寫的對象具有拷貝功能?
A:若想讓自己寫的對象具有拷貝功能,則需要實現(xiàn)NSCopying協(xié)議顶滩。如果自定義的對象分為可變版本和非可變版本余掖,那么就要同時實現(xiàn)NSCopying和NSMutableCopying協(xié)議,不過一般沒什么必要礁鲁,實現(xiàn)NSCopying協(xié)議就夠了盐欺。
5.可變集合類 和 不可變集合類的 copy 和 mutablecopy有什么區(qū)別?如果是集合是內(nèi)容復(fù)制的話仅醇,集合里面的元素也是內(nèi)容復(fù)制么找田?
A:對于不可變對象,copy操作是淺復(fù)制着憨,mutableCopy是深復(fù)制墩衙。對于不可變對象,mutableCopy不僅僅是深復(fù)制甲抖,返回的對象類型還是不可變對象類型相應(yīng)的可變對象的類型漆改。內(nèi)容復(fù)制也就是深拷貝,集合的深復(fù)制有兩個方法准谚,可以用initWithArray:copyItems:將第二個參數(shù)設(shè)置為YES即可進(jìn)行深復(fù)制挫剑,如:NSDictionary *shallowCopyDict = [NSDictionary alloc]initWithDictionary:someDictionary copyItems:YES];如果用這個方法深復(fù)制,集合里的每個元素都會收到copyWithZone:消息柱衔。如果集合里的對象遵循NSCopying協(xié)議樊破,那么對象就會深復(fù)制到新的集合。如果對象沒有遵循NSCopying協(xié)議唆铐,而嘗試用這種方法進(jìn)行深復(fù)制則會出錯哲戚。copyWithZone:這種拷貝方式只能提供一層內(nèi)存拷貝,而非真正的深拷貝艾岂。第二種方法是將集合進(jìn)行歸檔解檔顺少,如:NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
6.為什么IBOutlet修飾的UIView也適用weak關(guān)鍵字?
A:因為既然有外鏈那么視圖在xib或者storyboard中肯定存在,視圖已經(jīng)對它有一個強引用了脆炎。
7. nonatomic和atomic的區(qū)別梅猿?atomic是絕對的線程安全么?為什么秒裕?如果不是袱蚓,那應(yīng)該如何實現(xiàn)?
A:nonatomic和atomic的區(qū)別在于兩者自動生成getter和setter的方法不一樣几蜻,如果你自己寫getter和setter方法喇潘,那么(getter,setter入蛆,retain响蓉,copy硕勿,assign)只起提示作用哨毁,寫不寫都一樣。
對于atomic的屬性源武,系統(tǒng)生成的getter和setter會保證get扼褪,set的操作完整性,不受其他線程影響粱栖。比如線程A的getter方法運行到一半话浇,線程B調(diào)用了setter,那么線程A的getter還是能得到一個完整的對象闹究。
而nonatomic就沒有這個保證了幔崖,所以速度要比atomic快。
不過atomic可不能保證線程安全渣淤,如果線程A調(diào)用了getter赏寇,與此同時線程B和線程C都調(diào)了setter,那最后線程Aget到的值价认,三種都有可能:可能是B嗅定,C set之前原始的值,也可能是B set的值用踩,也可能是C set的值渠退。同時這個最終的值,也可能是B set的值脐彩,也可能是C set的值碎乃。要保證安全,可以使用線程鎖惠奸。
8.UICollectionView自定義layout如何實現(xiàn)荠锭?
A:UICollectionViewLayoutAttributes,UICollectionViewFlowLayout晨川。
9.用StoryBoard開發(fā)界面有什么弊端证九?如何避免删豺?
A:難以維護(hù),如果需要改動全局的一個字體愧怜,如果是代碼的話就很好辦呀页,pch或頭文件中改動就好了。如果是storyboard中就需要一個一個改動很麻煩拥坛。
如果storyboard中scene太多蓬蝶,打開storyboard會比較慢。
錯誤定位比較困難猜惋,好多錯誤提示模棱兩可丸氛。
10.進(jìn)程和線程的區(qū)別?同步異步的區(qū)別著摔?并行和并發(fā)的區(qū)別缓窜?
A:進(jìn)程是一個內(nèi)存中運行的應(yīng)用程序,比如在Windows系統(tǒng)中谍咆,一個運行的exe就是一個進(jìn)程禾锤。
線程是指進(jìn)程中的一個執(zhí)行流程。
同步是順序執(zhí)行摹察,執(zhí)行完一個再執(zhí)行下一個恩掷。需要等待,協(xié)調(diào)運行供嚎。
異步就是彼此獨立黄娘,在等待某事件的過程中繼續(xù)做自己的事,不需要等待這些事件完成后再工作克滴。
并行和并發(fā) 是前者相當(dāng)于三個人同時吃一個饅頭逼争,后者相當(dāng)于一個人同時吃三個饅頭。
并發(fā)性(Concurrence):指兩個或兩個以上的事件或活動在同一時間間隔內(nèi)發(fā)生偿曙。并發(fā)的實質(zhì)是一個物理CPU(也可以多個物理CPU) 在若干道程序之間多路復(fù)用氮凝,并發(fā)性是對有限物理資源強制行使多用戶共享以提高效率。
并行性(parallelism)指兩個或兩個以上事件或活動在同一時刻發(fā)生望忆。在多道程序環(huán)境下罩阵,并行性使多個程序同一時刻可在不同CPU上同時執(zhí)行。
區(qū)別:(并發(fā))一個處理器同時處理多個任務(wù)和(并行)多個處理器或者是多核的處理器同時處理多個不同的任務(wù)启摄。
11.線程間通信稿壁?
A:NSThread、GCD歉备、NSOperation傅是。
12.GCD的一些常用的函數(shù)?(group,barrier喧笔,信號量帽驯,線程同步)
A:1.延遲執(zhí)行任務(wù)函數(shù):dispatch_after(.....)。
2.一次性執(zhí)行dispatch_once(...)书闸。
3.柵欄函數(shù)dispatch_barrier_async/dispatch_barrier_sync尼变。
4.隊列組的使用dispatch_group_t。
5.GCD定時器浆劲。
13.如何使用隊列來避免資源搶奪嫌术?
A:dispatch_barrior_async 作用是在并行隊列中,等待前面兩個操作并行操作完成牌借。
14.數(shù)據(jù)持久化的幾個方案(fmdb用沒用過)
A:Coredata度气,realm,fmdb膨报。
15.說一下AppDelegate的幾個方法磷籍?從后臺到前臺調(diào)用了哪些方法?第一次啟動調(diào)用了哪些方法丙躏?從前臺到后臺調(diào)用了哪些方法择示?
A:
1.當(dāng)程序第一次運行并且將要顯示窗口的時候執(zhí)行束凑,在該方法中我們完成的操作
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
2.程序進(jìn)入后臺的時候首先執(zhí)行程序?qū)⒁∠钴S該方法
- (void)applicationWillResignActive:(UIApplication *)application
3.該方法當(dāng)應(yīng)用程序進(jìn)入后臺的時候調(diào)用
- (void)applicationDidEnterBackground:(UIApplication *)application
4.當(dāng)程序進(jìn)入將要前臺的時候調(diào)用
- (void)applicationWillEnterForeground:(UIApplication *)application
5.應(yīng)用程序已經(jīng)變得活躍(應(yīng)用程序的運行狀態(tài))
- (void)applicationDidBecomeActive:(UIApplication *)application
6.當(dāng)程序?qū)⒁顺龅臅r候調(diào)用晒旅,如果應(yīng)用程序支持后臺運行,該方法被applicationDidEnterBackground:替換
- (void)applicationWillTerminate:(UIApplication *)application
16.NSCache優(yōu)于NSDictionary的幾點汪诉?
A:NSCache 是一個容器類废恋,類似于NSDIctionary,通過key-value 形式存儲和查詢值,用于臨時存儲對象扒寄。
注意一點它和NSDictionary區(qū)別就是鱼鼓,NSCache 中的key不必實現(xiàn)copy,NSDictionary中的key必須實現(xiàn)copy该编。
NSCache中存儲的對象也不必實現(xiàn)NSCoding協(xié)議迄本,因為畢竟是臨時存儲,類似于內(nèi)存緩存课竣,程序退出后就被釋放了嘉赎。
17.知不知道Designated Initializer(指定初始化函數(shù))?使用它的時候有什么需要注意的問題于樟?
A:比如:
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
18.實現(xiàn)description方法能取到什么效果公条?
A:1.NSLog(@"%@", objectA);這會自動調(diào)用objectA的description方法來輸出ObjectA的描述信息.
2.description方法默認(rèn)返回對象的描述信息(默認(rèn)實現(xiàn)是返回類名和對象的內(nèi)存地址)
3.description方法是基類NSObject 所帶的方法,因為其默認(rèn)實現(xiàn)是返回類名和對象的內(nèi)存地址, 這樣的話,使用NSLog輸出OC對象,意義就不是很大,因為我們并不關(guān)心對象的內(nèi)存地址,比較關(guān)心的是對象內(nèi)部的一些成變量的值。因此,會經(jīng)常重寫description方法,覆蓋description方法的默認(rèn)實現(xiàn)迂曲。
19.objc使用什么機制管理對象內(nèi)存靶橱?
A:通過 retainCount 的機制來決定對象是否需要釋放。 每次 runloop 的時候,都會檢查對象的 retainCount关霸,如果retainCount 為 0传黄,說明該對象沒有地方需要繼續(xù)使用了,可以釋放掉了队寇。
20.block的實質(zhì)是什么尝江?一共有幾種block?都是什么情況下生成的英上?
A:block對象就是一個結(jié)構(gòu)體炭序,里面有isa指針指向自己的類(global malloc stack),有desc結(jié)構(gòu)體描述block的信息苍日,__forwarding指向自己或堆上自己的地址惭聂,如果block對象截獲變量,這些變量也會出現(xiàn)在block結(jié)構(gòu)體中相恃。最重要的block結(jié)構(gòu)體有一個函數(shù)指針辜纲,指向block代碼塊。block結(jié)構(gòu)體的構(gòu)造函數(shù)的參數(shù)拦耐,包括函數(shù)指針耕腾,描述block的結(jié)構(gòu)體,自動截獲的變量(全局變量不用截獲)杀糯,引用到的__block變量扫俺。(__block對象也會轉(zhuǎn)變成結(jié)構(gòu)體)
block代碼塊在編譯的時候會生成一個函數(shù),函數(shù)第一個參數(shù)是前面說到的block對象結(jié)構(gòu)體指針固翰。執(zhí)行block狼纬,相當(dāng)于執(zhí)行block里面__forwarding里面的函數(shù)指針。
block一共有三種骂际,分別是Globle全局block疗琉,棧block,堆block歉铝。
21.static inline 是什么盈简?
A:static inline內(nèi)聯(lián)函數(shù):使用它可以減少函數(shù)運行時間,提高程序運行速度太示。但內(nèi)聯(lián)函數(shù)里不能寫循環(huán)柠贤,開關(guān)語句,而且最好不寫過于冗長的函數(shù)先匪。
22.屬性的默認(rèn)關(guān)鍵字是什么种吸?
A:在聲明property時,如果不指定關(guān)鍵字呀非,編譯器會為property生成默認(rèn)的關(guān)鍵字坚俗。
對應(yīng)基本數(shù)據(jù)類型镜盯,默認(rèn)關(guān)鍵字為atomic,assign猖败,readwrite速缆。
對應(yīng)對象類型,默認(rèn)關(guān)鍵字為atomic恩闻,strong艺糜,readwrite。
23.為什么在默認(rèn)情況下無法修改被block捕獲的變量幢尚?__block都做了什么破停?
A:在block中訪問的外部變量是復(fù)制過去的,寫操作不對原變量生效尉剩。
24.模擬一下循環(huán)引用的一個情況真慢?block實現(xiàn)界面反向傳值該怎么做?
A:兩個.h文件互相import了對方造成循環(huán)引用理茎。block先聲明(在要傳值的controller里聲明
typedef void(^MyBlock)(NSString *name);//block的重命名
@property (nonatomic,copy) MyBlock block;//block的聲明)黑界,在準(zhǔn)備接收值的頁面里實現(xiàn)block,
secondVC.block = ^void(NSString *name)
{
_label.text = name;
};皂林,誰要傳值就在誰那里調(diào)用self.block(@"lalala");朗鸠。
25.iOS事件傳遞響應(yīng)鏈?zhǔn)鞘裁矗?/h1>
A:當(dāng)我們在使用微信等工具,點擊掃一掃础倍,就能打開二維碼掃描視圖烛占。在我們點擊屏幕的時候,iphone OS獲取到了用戶進(jìn)行了“單擊”這一行為著隆,操作系統(tǒng)把包含這些點擊事件的信息包裝成UITouch和UIEvent形式的實例扰楼,然后找到當(dāng)前運行的程序呀癣,逐級尋找能夠響應(yīng)這個事件的對象美浦,直到?jīng)]有響應(yīng)者響應(yīng)。這一尋找的過程项栏,被稱作事件的響應(yīng)鏈浦辨。
不同的響應(yīng)者以鏈?zhǔn)椒绞綄ふ遥珹ppDelegate->UIApplication->UIWindow->UIViewController->UIView->UIButton沼沈。
26.利用kvo數(shù)據(jù)綁定流酬,在mvvm模式中,數(shù)據(jù)綁定被用的很廣泛列另,能夠動態(tài)的根據(jù)數(shù)據(jù)改變刷新UI芽腾。
27.多線程鎖
28.strong,weak页衙,assign的區(qū)別
29.類和結(jié)構(gòu)體的區(qū)別
30.怎么oc與swift混編摊滔?
31.mrc與arc混編阴绢?
32.http與tcp的區(qū)別?
A:TCP連接:手機能夠使用聯(lián)網(wǎng)功能是因為手機底層實現(xiàn)了TCP/IP協(xié)議艰躺,可以使手機通過無線網(wǎng)絡(luò)建立TCP連接呻袭。TCP協(xié)議可以對上層網(wǎng)絡(luò)提供接口,使上層網(wǎng)絡(luò)數(shù)據(jù)的傳輸建立在“無差別”的網(wǎng)絡(luò)上腺兴。
建立起一個TCP連接需要經(jīng)過“三次握手”:
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器左电,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn)页响;
第二次握手:服務(wù)器收到syn包篓足,必須確認(rèn)客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k)闰蚕,即SYN+ACK包纷纫,此時服務(wù)器進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包陪腌,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1)辱魁,此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài)诗鸭,完成三次握手染簇。
握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后强岸,客戶端和服務(wù)器才正式開始傳送數(shù)據(jù)锻弓。理想狀態(tài)下,TCP連接一旦建立蝌箍,在通信雙方中的任何一方主動關(guān)閉連接之前青灼,TCP連接都將一直被保持下去。斷開連接時服務(wù)器和客戶端均可主動發(fā)起斷開TCP連接的請求妓盲,斷開過程需要經(jīng)過“四次握手”杂拨。
HTTP連接:HTTP協(xié)議即超文本傳送協(xié)議,是Web聯(lián)網(wǎng)的基礎(chǔ)悯衬,也是手機聯(lián)網(wǎng)常用的協(xié)議之一弹沽,HTTP協(xié)議是建立在TCP協(xié)議的一種應(yīng)用。
HTTP連接最顯著的特點是客戶端發(fā)送的每次請求都需要服務(wù)器回送響應(yīng)筋粗,在請求結(jié)束后策橘,會主動釋放連接。從建立連接到關(guān)閉連接的過程稱為“一次連接”娜亿。
1.在HTTP 1.0中丽已,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求后买决,會自動釋放連接沛婴。
2.在HTTP 1.1中則可以在一次連接中處理多個請求辰斋,并且多個請求可以重疊進(jìn)行,不需要等待一個請求結(jié)束后再發(fā)送下一個請求瘸味。
由于HTTP在每次請求結(jié)束后都會主動釋放連接宫仗,因此HTTP連接是一種短連接,要保持客戶端程序的在線狀態(tài)旁仿,需要不斷地向服務(wù)器發(fā)起連接請求藕夫。通常的做法是即時不需要獲得任何數(shù)據(jù),客戶端也保持每隔一段固定的時間向服務(wù)器發(fā)送一次“保持連接”的請求枯冈,服務(wù)器在收到該請求后對客戶端進(jìn)行回復(fù)毅贮,表明知道客戶端“在線”。若服務(wù)器長時間無法收到客戶端的請求尘奏,則認(rèn)為客戶端“下線”滩褥,若客戶端長時間無法收到服務(wù)器的回復(fù),則認(rèn)為網(wǎng)絡(luò)已經(jīng)斷開炫加。
33.進(jìn)程間常用通信方式有哪些瑰煎?
A:1.URL Scheme
2.Keychain
3.UIPasteboard
4.UIDocumentInteractionController
5.Local socket
6.AirDrop
7.UIActivityViewController
8.App Groups