iOS知識點(diǎn)回顧(3)

這些知識點(diǎn)是從網(wǎng)上各個地方看到的,非原創(chuàng),僅是總結(jié)。

1.UIWindow和UIView和 CALayer 的聯(lián)系和區(qū)別?

UIView是視圖的基類,UIViewController是視圖控制器的基類,UIResponder是表示一個可以在屏幕上響應(yīng)觸摸事件的對象;

UIwindow是UIView的子類,UIWindow的主要作用:一是提供一個區(qū)域來顯示UIView,二是將事件(event)的分發(fā)給UIView,一個應(yīng)用基本上只有一個UIWindow.

萬物歸根,UIView和CALayer都是的老祖都是NSObjet。可見 UIResponder是用來響應(yīng)事件的,也就是UIView可以響應(yīng)用戶事件。

CALayer 和 UIView 的區(qū)別:

1.1 UIView的繼承結(jié)構(gòu)為: UIResponder : NSObject。

CALayer的繼承結(jié)構(gòu)為: NSObject。可見 UIResponder是用來響應(yīng)事件的,也就是UIView可以響應(yīng)用戶事件,CALayer直接從 NSObject繼承,因?yàn)槿鄙倭薝IResponder類,不能響應(yīng)任何用戶事件

1.2 所屬框架,UIView是在 /System/Library/Frameworks/UIKit.framework中定義的,UIKit主要是用來構(gòu)建用戶界面,并且是可以響應(yīng)事件的。CALayer是在/System/Library/Frameworks/QuartzCore.framework定義的。而且CALayer作為一個低級的,可以承載繪制內(nèi)容的底層對象出現(xiàn)在該框架中。

1.3 UIView相比CALayer最大區(qū)別是UIView可以響應(yīng)用戶事件,而CALayer不可以。UIView側(cè)重于對顯示內(nèi)容的管理,CALayer側(cè)重于對內(nèi)容的繪制。UIView是基于CALayer的高層封裝。

1.4 相似支持1:相似的樹形結(jié)構(gòu)2:顯示內(nèi)容繪制方式3: 布局約束

總結(jié)一下就是:UIView是用來顯示內(nèi)容的,可以處理用戶事件.CALayer是用來繪制內(nèi)容的,對內(nèi)容進(jìn)行動畫處理依賴與UIView來進(jìn)行顯示,不能處理用戶事件

為啥有兩套體系 并不是兩套體系?UIView和CALayer是相互依賴的關(guān)系。UIView依賴與calayer提供的內(nèi)容,CALayer依賴uivew提供的容器來顯示繪制的內(nèi)容。歸根到底CALayer是這一切的基礎(chǔ),如果沒有CALayer,UIView自身也不會存在,UIView是一個特殊的CALayer實(shí)現(xiàn),添加了響應(yīng)事件的能力。UIView本身,更像是一個CALayer的管理器,訪問它的跟繪圖和跟坐標(biāo)有關(guān)的屬性,例如frame,bounds等等,實(shí)際上內(nèi)部都是在訪問它所包含的CALayer的相關(guān)屬性。

UIView的layer樹形在系統(tǒng)內(nèi)部,被系統(tǒng)維護(hù)著三份copy(這段理解有點(diǎn)吃不準(zhǔn))。

第一份,邏輯樹,就是代碼里可以操縱的,例如更改layer的屬性等等就在這一份。

第二份,動畫樹,這是一個中間層,系統(tǒng)正在這一層上更改屬性,進(jìn)行各種渲染操作。

第三份,顯示樹,這棵樹的內(nèi)容是當(dāng)前正被顯示在屏幕上的內(nèi)容。

這三棵樹的邏輯結(jié)構(gòu)都是一樣的,區(qū)別只有各自的屬性。

UIView的主layer以外,對它的subLayer,也就是子layer的屬性進(jìn)行更改,系統(tǒng)將自動進(jìn)行動畫生成。

CALayer的坐標(biāo)系系統(tǒng)和UIView有點(diǎn)不一樣,它多了一個叫anchorPoint的屬性,它使用CGPoint結(jié)構(gòu),但是值域是0~1,也就是按照比例來設(shè)置。這個點(diǎn)是各種圖形變換的坐標(biāo)原點(diǎn),同時會更改layer的position的位置,它的缺省值是{0.5, 0.5},也就是在layer的中央。


2.iOS中socket使用

Socket是對TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個調(diào)用接口(API),通過Socket,我們才能使用TCP/IP協(xié)議。

http協(xié)議 對應(yīng)于應(yīng)用層

tcp協(xié)議 對應(yīng)于傳輸層

ip協(xié)議 對應(yīng)于網(wǎng)絡(luò)層

三者本質(zhì)上沒有可比性。 何況HTTP協(xié)議是基于TCP連接的。

TCP/IP是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸;而HTTP是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)。

我 們在傳輸數(shù)據(jù)時,可以只使用傳輸層(TCP/IP),但是那樣的話,由于沒有應(yīng)用層,便無法識別數(shù)據(jù)內(nèi)容,如果想要使傳輸?shù)臄?shù)據(jù)有意義,則必須使用應(yīng)用層 協(xié)議,應(yīng)用層協(xié)議很多,有HTTP、FTP、TELNET等等,也可以自己定義應(yīng)用層協(xié)議。WEB使用HTTP作傳輸層協(xié)議,以封裝HTTP文本信息,然 后使用TCP/IP做傳輸層協(xié)議將它發(fā)送到網(wǎng)絡(luò)上。

SOCKET原理

1、套接字(socket)概念

套接字(socket)是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。它是網(wǎng)絡(luò)通信過程中端點(diǎn)的抽象表示,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址,本地進(jìn)程的協(xié)議端口,遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口。

應(yīng) 用層通過傳輸層進(jìn)行數(shù)據(jù)通信時,TCP會遇到同時為多個應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題。多個TCP連接或多個應(yīng)用程序進(jìn)程可能需要通過同一個 TCP協(xié)議端口傳輸數(shù)據(jù)。為了區(qū)別不同的應(yīng)用程序進(jìn)程和連接,許多計算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口。應(yīng) 用層可以和傳輸層通過Socket接口,區(qū)分來自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信,實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。

2 、建立socket連接

建立Socket連接至少需要一對套接字,其中一個運(yùn)行于客戶端,稱為ClientSocket,另一個運(yùn)行于服務(wù)器端,稱為ServerSocket。

套接字之間的連接過程分為三個步驟:服務(wù)器監(jiān)聽,客戶端請求,連接確認(rèn)。

服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實(shí)時監(jiān)控網(wǎng)絡(luò)狀態(tài),等待客戶端的連接請求。

客戶端請求:指客戶端的套接字提出連接請求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號,然后就向服務(wù)器端套接字提出連接請求。

連 接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時,就響應(yīng)客戶端套接字的請求,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶 端,一旦客戶端確認(rèn)了此描述,雙方就正式建立連接。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。

3、SOCKET連接與TCP連接

創(chuàng)建Socket連接時,可以指定使用的傳輸層協(xié)議,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP),當(dāng)使用TCP協(xié)議進(jìn)行連接時,該Socket連接就是一個TCP連接。

4、Socket連接與HTTP連接

由 于通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發(fā)送數(shù)據(jù)內(nèi)容,直到雙方連接斷開。但在實(shí)際網(wǎng)絡(luò)應(yīng)用 中,客戶端到服務(wù)器之間的通信往往需要穿越多個中間節(jié)點(diǎn),例如路由器、網(wǎng)關(guān)、防火墻等,大部分防火墻默認(rèn)會關(guān)閉長時間處于非活躍狀態(tài)的連接而導(dǎo)致 Socket 連接斷連,因此需要通過輪詢告訴網(wǎng)絡(luò),該連接處于活躍狀態(tài)。

而HTTP連接使用的是“請求—響應(yīng)”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務(wù)器發(fā)出請求后,服務(wù)器端才能回復(fù)數(shù)據(jù)。

很 多情況下,需要服務(wù)器端主動向客戶端推送數(shù)據(jù),保持客戶端與服務(wù)器數(shù)據(jù)的實(shí)時與同步。此時若雙方建立的是Socket連接,服務(wù)器就可以直接將數(shù)據(jù)傳送給 客戶端;若雙方建立的是HTTP連接,則服務(wù)器需要等到客戶端發(fā)送一次請求后才能將數(shù)據(jù)傳回給客戶端,因此,客戶端定時向服務(wù)器端發(fā)送連接請求,不僅可以 保持在線,同時也是在“詢問”服務(wù)器是否有新的數(shù)據(jù),如果有就將數(shù)據(jù)傳給客戶端。

3.網(wǎng)絡(luò)請求中post和get的區(qū)別

GET是用于獲取數(shù)據(jù)的,POST一般用于將數(shù)據(jù)發(fā)給服務(wù)器之用。

普遍答案

1.GET使用URL或Cookie傳參。而POST將數(shù)據(jù)放在BODY中。

2.GET的URL會有長度上的限制,則POST的數(shù)據(jù)則可以非常大。

3.POST比GET安全,因?yàn)閿?shù)據(jù)在地址欄上不可見。

4.支付寶SDK使用

使用支付寶進(jìn)行一個完整的支付功能,大致有以下步驟:向支付寶申請, 與支付寶簽約,獲得商戶ID(partner)和賬號ID(seller)和私鑰(privateKey)。下載支付寶SDK,生成訂單信息,簽名加密調(diào)用支付寶客戶端,由支付寶客戶端跟支付寶安全服務(wù)器打交道。支付完畢后,支付寶客戶端會自動跳回到原來的應(yīng)用程序,在原來的應(yīng)用程序中顯示支付結(jié)果給用戶看。

5.遠(yuǎn)程推送

當(dāng)服務(wù)端遠(yuǎn)程向APNS推送至一臺離線的設(shè)備時,蘋果服務(wù)器Qos組件會自動保留一份最新的通知,等設(shè)備上線后,Qos將把推送發(fā)送到目標(biāo)設(shè)備上

遠(yuǎn)程推送的基本過程

1.客戶端的app需要將用戶的UDID和app的bundleID發(fā)送給apns服務(wù)器,進(jìn)行注冊,apns將加密后的device Token返回給app

2.app獲得device Token后,上傳到公司服務(wù)器

3.當(dāng)需要推送通知時,公司服務(wù)器會將推送內(nèi)容和device Token一起發(fā)給apns服務(wù)器

4.apns再將推送內(nèi)容送到客戶端上

創(chuàng)建證書的流程:

1.打開鑰匙串,生成CertificateSigningRequest.certSigningRequest文件

2.將CertificateSigningRequest.certSigningRequest上傳進(jìn)developer,導(dǎo)出.cer文件

3.利用CSR導(dǎo)出P12文件

4.需要準(zhǔn)備下設(shè)備token值(無空格)

5.使用OpenSSL合成服務(wù)器所使用的推送證書


6.__block和__weak修飾符的區(qū)別:

__block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數(shù)據(jù)類型。

__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數(shù)據(jù)類型(int)。

__block對象可以在block中被重新賦值,__weak不可以。

7.常見的 Http 狀態(tài)碼有哪些?

http狀態(tài)嗎 :302 是請求重定向。500以上是服務(wù)器錯誤。400以上是請求鏈接錯誤或者找不到服務(wù)器。200以上是正確。100以上是請求接受成功。

8.單例的寫法。在單例中使用數(shù)組要注意什么?

static PGSingleton *sharedSingleton;

+ (instancetype)sharedSingleton

{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

sharedSingleton = [[PGSingleton alloc] init];

});

return sharedSingleton;

}

單例使用 NSMutableArray 的時候,防止多個地方對它同時遍歷和修改的話,需要加原子屬性。并且property用strong,并且寫一個遍歷和修改的方法。加上鎖. Lock,UnLock.

9.static 關(guān)鍵字的作用

1.函數(shù)體內(nèi) static 變量的作用范圍為該函數(shù)體,不同于 auto 變量,該變量的內(nèi)存只被分配一次,

因此其值在下次調(diào)用時仍維持上次的值;

2.在模塊內(nèi)的 static 全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問;

3.在模塊內(nèi)的 static 函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個函數(shù)的使用范圍被限制在聲明 它的模塊內(nèi);

4.在類中的 static 成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝;

5.在類中的 static 成員函數(shù)屬于整個類所擁有,這個函數(shù)不接收 this 指針,因而只能訪問類的static 成員變量。

10.iOS 中的事件的傳遞:響應(yīng)鏈

事件沿著一個指定的路徑傳遞直到它遇見可以處理它的對象。 首先一個UIApplication 對象從隊列頂部獲取一個事件并分發(fā)(dispatches)它以便處理。 通常,它把事件傳遞給應(yīng)用程序的關(guān)鍵窗口對象,該對象把事件傳遞給一個初始對象來處理。 初始對象取決于事件的類型。

觸摸事件。 對于觸摸事件,窗口對象首先嘗試把事件傳遞給觸摸發(fā)生的視圖。那個視圖被稱為hit-test(點(diǎn)擊測試)視圖。 尋找hit-test視圖的過程被稱為hit-testing, 參見 “Hit-Testing Returns the View Where a Touch Occurred.”

運(yùn)動和遠(yuǎn)程控制事件。 對于這些事件,窗口對象把shaking-motion(搖晃運(yùn)動)或遠(yuǎn)程控制事件傳遞給第一響應(yīng)者來處理。第一響應(yīng)者請參見 “The Responder Chain Is Made Up of Responder Objects.”

iOS 使用hit-testing來找到事件發(fā)生的視圖。 Hit-testing包括檢查觸摸事件是否發(fā)生在任何相關(guān)視圖對象的范圍內(nèi), 如果是,則遞歸地檢查所有視圖的子視圖。在視圖層次中的最底層視圖,如果它包含了觸摸點(diǎn),那么它就是hit-test視圖。等 iOS決定了hit-test視圖之后,它把觸摸事件傳遞給該視圖以便處理。

11.堆和棧的區(qū)別

管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產(chǎn)生memory leak。

申請大小:

棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。

堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。

碎片問題:對于堆來講,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題,因?yàn)闂J窍冗M(jìn)后出的隊列,他們是如此的一一對應(yīng),以至于永遠(yuǎn)都不可能有一個內(nèi)存塊從棧中間彈出

分配方式:堆都是動態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動態(tài)分配由alloca函數(shù)進(jìn)行分配,但是棧的動態(tài)分配和堆是不同的,他的動態(tài)分配是由編譯器進(jìn)行釋放,無需我們手工實(shí)現(xiàn)。

分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計算機(jī)會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫提供的,它的機(jī)制是很復(fù)雜的。

12.SDWebImage的原理。實(shí)現(xiàn)機(jī)制。如何解決TableView卡的問題。

tableView 滑動卡的問題主要是因?yàn)椋簭木彺嬷谢蛘呤菑谋镜刈x取圖片給UIImage的時候耗費(fèi)的時間。需要把下面的兩句話放到子線程里面:

NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]]; //得到圖像數(shù)據(jù)

UIImage *image = [UIImage imageWithData:imgData];

把UIImage賦值給圖片的時候在主線程。

子線程不能更新UI 所有的UI跟新都是主線程執(zhí)行了。手指滑動屏幕了。或者屏幕的某個方法執(zhí)行了。

13.copy與retain:

1、copy其實(shí)是建立了一個相同的對象,而retain不是;

2、copy是內(nèi)容拷貝,retain是指針拷貝;

3、copy是內(nèi)容的拷貝 ,對于像NSString,的確是這樣,但是如果copy的是一個NSArray呢?這時只是copy了指向array中相對應(yīng)元素的指針.這便是所謂的"淺復(fù)制".

4、copy的情況:NSString *newPt = [pt copy];

此時會在堆上重新開辟一段內(nèi)存存放@"abc" 比如0X1122 內(nèi)容為@"abc 同時會在棧上為newPt分配空間 比如地址:0Xaacc 內(nèi)容為0X1122 因此retainCount增加1供newPt來管理0X1122這段內(nèi)存;

14.assign與retain:

1、assign: 簡單賦值,不更改索引計數(shù);

2、assign的情況:NSString *newPt = [pt assing];

此時newPt和pt完全相同 地址都是0Xaaaa 內(nèi)容為0X1111 即newPt只是pt的別名,對任何一個操作就等于對另一個操作, 因此retainCount不需要增加;

3、assign就是直接賦值;

4、retain使用了引用計數(shù),retain引起引用計數(shù)加1, release引起引用計數(shù)減1,當(dāng)引用計數(shù)為0時,dealloc函數(shù)被調(diào)用,內(nèi)存被回收;

5、retain的情況:NSString *newPt = [pt retain];

此時newPt的地址不再為0Xaaaa,可能為0Xaabb 但是內(nèi)容依然為0X1111。 因此newPt 和 pt 都可以管理"abc"所在的內(nèi)存,因此 retainCount需要增加1 ;

15.readonly:

1、屬性是只讀的,默認(rèn)的標(biāo)記是讀寫,如果你指定了只讀,在@implementation中只需要一個讀取器。或者如果你使用@synthesize關(guān)鍵字,也是有讀取器方法被解析

readwrite:

1、說明屬性會被當(dāng)成讀寫的,這也是默認(rèn)屬性。設(shè)置器和讀取器都需要在@implementation中實(shí)現(xiàn)。如果使用@synthesize關(guān)鍵字,讀取器和設(shè)置器都會被解析;

nonatomic:

1、非原子性訪問,對屬性賦值的時候不加鎖,多線程并發(fā)訪問會提高性能。如果不加此屬性,則默認(rèn)是兩個訪問方法都為原子型事務(wù)訪問;

16.weak and strong property (強(qiáng)引用和弱引用的區(qū)別):

1、 weak 和 strong 屬性只有在你打開ARC時才會被要求使用,這時你是不能使用retain release autorelease 操作的,因?yàn)锳RC會自動為你做好這些操作,但是你需要在對象屬性上使用weak 和strong,其中strong就相當(dāng)于retain屬性,而weak相當(dāng)于assign。

2、只有一種情況你需要使用weak(默認(rèn)是strong),就是為了避免retain cycles(就是父類中含有子類{父類retain了子類},子類中又調(diào)用了父類{子類又retain了父類},這樣都無法release)

3、聲明為weak的指針,指針指向的地址一旦被釋放,這些指針都將被賦值為nil。這樣的好處能有效的防止野指針。

17.線程與進(jìn)程的區(qū)別和聯(lián)系?

進(jìn)程和線程都是由操作系統(tǒng)所體會的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性。

進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個進(jìn)程崩潰后,在保護(hù)模式下不會對其它進(jìn)程產(chǎn)生影響,而線程只是一個進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間,一個線程死掉就等于整個進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時,耗費(fèi)資源較大,效率要差一些。但對于一些要求同時進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。

18.UIButton的繼承關(guān)系是怎么樣

UIButton > UIControl > UIView > UIResponder > NSObject

19.delegate和protocol(區(qū)別)

協(xié)議(protocol),就是使用了這個協(xié)議后就要按照這個協(xié)議來辦事,協(xié)議要求實(shí)現(xiàn)的方法就一定要實(shí)現(xiàn)。

委托(delegate),顧名思義就是委托別人辦事,就是當(dāng) 一件事情發(fā)生后,自己不處理,讓別人來處理。

delegate只是一種模式,大家約定俗成,當(dāng)把自己內(nèi)部一部分實(shí)現(xiàn)暴露給另外一個類去做的時候,就叫實(shí)際做事的類為delegate。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,374評論 0 6
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,014評論 0 7
  • 多線程、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時機(jī)制的原理和運(yùn)用場景。SDWebImage的原...
    LZM輪回閱讀 2,043評論 0 12
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,434評論 0 35
  • 1.寫一個NSString類的實(shí)現(xiàn) +(id)initWithCString:(c*****t char *)nu...
    韓七夏閱讀 3,805評論 2 37