新iOS面試題大全完整版

馬上金九銀十,相信最近很多人都在跳槽,我這里就根據(jù)知識(shí)點(diǎn)分門別類的整理了一下(朋友面試,網(wǎng)上收集等等),想看哪一塊可以快速找到,希望可以幫助大家,祝大家求職順利。

一般面試題

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

1.內(nèi)存管理范圍 只有oc對(duì)象需要進(jìn)行內(nèi)存管理 非oc對(duì)象類型比如基本數(shù)據(jù)類型不需要進(jìn)行內(nèi)存管理 2.內(nèi)存管理本質(zhì) 因?yàn)椋篛bjective-C的對(duì)象在內(nèi)存中是以堆的方式分配空間的,并且堆內(nèi)存是由你釋放的,就是release OC對(duì)象存放于堆里面(堆內(nèi)存要程序員手動(dòng)回收) 非OC對(duì)象一般放在棧里面(棧內(nèi)存會(huì)被系統(tǒng)自動(dòng)回收) 堆里面的內(nèi)存是動(dòng)態(tài)分配的,所以也就需要程序員手動(dòng)的去添加內(nèi)存、回收內(nèi)存 3.內(nèi)存分配以及管理方式 按分配方式分 堆是動(dòng)態(tài)分配和回收內(nèi)存的,沒有靜態(tài)分配的堆 棧有兩種分配方式:靜態(tài)分配和動(dòng)態(tài)分配 靜態(tài)分配是系統(tǒng)編譯器完成的,比如局部變量的分配 動(dòng)態(tài)分配是有alloc函數(shù)進(jìn)行分配的,但是棧的動(dòng)態(tài)分配和堆是不同的,它的動(dòng)態(tài)分配也由系統(tǒng)編譯器進(jìn)行釋放,不需要程序員手動(dòng)管理 按管理方式分 對(duì)于棧來講,是由系統(tǒng)編譯器自動(dòng)管理,不需要程序員手動(dòng)管理 對(duì)于堆來講,釋放工作由程序員手動(dòng)管理,不及時(shí)回收容易產(chǎn)生內(nèi)存泄露 堆:是大家共有的空間,分全局堆和局部堆。全局堆就是所有沒有分配的空間,局部堆就是用戶分配的空間。堆在操作系統(tǒng)對(duì)進(jìn)程 初始化的時(shí)候分配,運(yùn)行過程中也可以向系統(tǒng)要額外的堆,但是記得用完了要還給操作系統(tǒng),要不然就是內(nèi)存泄漏。堆里面一般 放的是靜態(tài)數(shù)據(jù),比如static的數(shù)據(jù)和字符串常量等,資源加載后一般也放在堆里面。一個(gè)進(jìn)程的所有線程共有這些堆 ,所以對(duì)堆的操作要考慮同步和互斥的問題。程序里面編譯后的數(shù)據(jù)段都是堆的一部分。 棧:是個(gè)線程獨(dú)有的,保存其運(yùn)行狀態(tài)和局部自動(dòng)變量的。棧在線程開始的時(shí)候初始化,每個(gè)線程的?;ハ嗒?dú)立,因此 ,棧是 thread safe的。每個(gè)c++對(duì)象的數(shù)據(jù)成員也存在在棧中,每個(gè)函數(shù)都有自己的棧,棧被用來在函數(shù)之間傳遞參數(shù)。操作系統(tǒng)在切換線程的時(shí)候會(huì)自動(dòng)的切換棧,就是切換ss/esp寄存器。??臻g不需要在高級(jí)語言里面顯式的分配 和釋放。 一句話總結(jié)就是 堆:由程序員分配和釋放,如果不釋放可能會(huì)引起內(nèi)存泄漏 棧:由編譯器自動(dòng)分配和釋放,一般存放參數(shù)值,局部變量

2.KVO和KVC

KVC,即是指 NSKeyValueCoding(鍵值編碼),提供一種機(jī)制來間接訪問對(duì)象的屬性。KVC 就是基于KVO技術(shù)來實(shí)現(xiàn)的。 KVO,提供了一種觀察者的機(jī)制,通過對(duì)某個(gè)對(duì)象的某個(gè)屬性添加觀察者,當(dāng)該屬性改變,就會(huì)調(diào)用"observeValueForKeyPath:"方法。

  1. OC中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼, 方法是什么?如果想延時(shí)執(zhí)行代碼、方法是什么?

1、線程創(chuàng)建有三種方法:使用NSThread創(chuàng)建、使用GCD的dispatch、使用子類化的NSOperation,然后將其加入NSOperationQueue; 2、在主線程執(zhí)行代碼,方法是performSelectorOnMainThread:withObject:waitUntilDone:; 3、如果想延時(shí)執(zhí)行代碼可以用performSelector:onThread:withObject:waitUntilDone:;

4.指針與數(shù)組名的關(guān)系?

int arrayName[4] = {10, 20, 30, 40}; int *p = (int *)(&arrayName + 1); NSLog(@"%d", (&arrayName - 1)); 1.(&arrayName + 1):&arrayName是數(shù)組的地址(等價(jià)于指向arrayName數(shù)組的指針) 2.增加 1 會(huì)往后移動(dòng)16個(gè)字節(jié),開始是4個(gè)字節(jié)的位置,移動(dòng)后就是16個(gè)字節(jié)后面的位置(也就是目前位置是20個(gè)字節(jié)) 3.最后又賦值給,int類型的指針p(int類型占4個(gè)字節(jié)) 4.所以(p - 1)就是減去4個(gè)字節(jié),變成為16個(gè)字節(jié)的位置,輸出的(p - 1)值為40 int *p = (int *)(&arrayName + 1); NSLog(@"%d", *(p - 1));//輸出結(jié)果為 40

5.#import 和#include有 么區(qū)別?@class呢?#import <>和 #import"" 有 么區(qū)別?

import是OC導(dǎo)入頭文件的關(guān)鍵字,#include是C/C++導(dǎo)入頭文件的關(guān)鍵字 使用#import只導(dǎo)入一次不會(huì)重復(fù)導(dǎo)入,相當(dāng)于#include和#pragma once;(使用#include可能會(huì)出現(xiàn)循環(huán)引用,使用#pragma once消除這種可能) @class一般用于聲明某個(gè)字符串作為類名使用,它只是聲明了一個(gè)類名,沒有導(dǎo)入.h文件中的內(nèi)容,不會(huì)引起交叉編譯問題 import< >代表導(dǎo)入系統(tǒng)自帶的框架 import" "代表導(dǎo)入我們自己創(chuàng)建的文件,導(dǎo)入的使我們.h文件,也就是頭文件

朋友贈(zèng)送的資料:

最近需要面試,簡歷,內(nèi)推,學(xué)習(xí)進(jìn)階的可以看看 ↓↓↓↓↓↓

iOS入門到進(jìn)階資料整理:https://docs.qq.com/doc/DVU5LY1Bsb3dSZ3Nn

6.屬性readwrite.readonly,assign,retain,copy,nonatomic 什么作用 ? 在哪種情況下 ?

readwrite 是可讀可寫特性;需要生成getter方法和setter方法時(shí)(補(bǔ)充:默認(rèn)屬性,將生成不帶額外參數(shù)的getter和setter方法(setter方法只有一個(gè)參數(shù))) readonly 是只讀特性 只會(huì)生成getter方法 不會(huì)生成setter方法 ;不希望屬性在類外改變 assign 是賦值特性,setter方法將傳入?yún)?shù)賦值給實(shí)例變量;僅設(shè)置變量時(shí); retain 表示持有特性,setter方法將傳入?yún)?shù)先保留,再賦值,傳入?yún)?shù)的retaincount會(huì)+1; copy 表示拷貝特性,setter方法將傳入對(duì)象復(fù)制一份;需要完全一份新的變量時(shí)。 nonatomic 非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全,一般使 用nonatomic

7.IBOutlet 連出來的視圖屬性為什么可以被設(shè)置成weak?

在 storyboard 中添加一個(gè)控件引用關(guān)系是這樣的(以 UIbutton 為例): UIviewController -> UIview -> UIbutton 此時(shí) UIviewController 強(qiáng)引用著 UIview , UIview 強(qiáng)引用著 UIbutton , IBoutlet 連線到控制器的. m 或者. h 中作為視圖的屬性時(shí)用 weak 修飾就可以了, (覺得用 strong 修飾也可以但是沒有必要) 添加到子控件也是強(qiáng)引用: UIbutton 就是添加到了 UIviewController 的 view 上

8 預(yù)處 指令define 聲明 個(gè)常數(shù), 以表明 中有多 少秒(忽 閏 問題)。

define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

9.重寫-個(gè)NSString類型的,retain 式聲明name屬性的 setter和getter 法(MRC)

屬性的三大特性:語義特性,原子特性,讀寫特性. 同時(shí)重寫setter和getter方法,@synchronized name = _name,關(guān)聯(lián)屬性和實(shí)例變量 如 -(void)setName:(NSString *)name{ if(_name != name){ [_name retain]; [_name release]; _name = name; } } -(NSString *)name{ return [[_name retain]autorelease] }

10.分析json、xml 的區(qū)別? json、xml 解析 式的底層是如何讓處理的

(一)JSON與XML的區(qū)別: (1)可讀性方面:基本相同,XML的可讀性比較好; (2)可擴(kuò)展性方面:都具有良好的擴(kuò)展性; (3)編碼難度方面:相對(duì)而言,JSON的編碼比較容易; (4)解碼難度:JSON的解碼難度基本為零,XML需要考慮子節(jié)點(diǎn)和父節(jié)點(diǎn); (5)數(shù)據(jù)體積方面:JSON相對(duì)于XML來講,數(shù)據(jù)體積小,傳遞的速度比較快; (6)數(shù)據(jù)交互方面:JSON與javascript的交互更加方便,更容易解析處理,更好的數(shù)據(jù)交互; (7)數(shù)據(jù)描述方面:XML對(duì)數(shù)據(jù)描述性比較好 (8)傳輸速度方面:JSON的速度遠(yuǎn)遠(yuǎn)快于XML。 (二)JSON與XML底層實(shí)現(xiàn)原理: ?。?)JSON底層原理:遍歷字符串中的字符,最終根據(jù)格式規(guī)定的特殊字符,比如{}、[]、:等進(jìn)行區(qū)分,{}號(hào)表示字典,[]號(hào)表示數(shù)組,:號(hào)是字典的鍵和值的分水嶺,最終仍是將JSON轉(zhuǎn)化為字典,只不過字典中的值可能是“字典、數(shù)組或者字符串而已”。   (2)XML底層原理:XML解析常用的解析方法有兩種:DOM解析和SAX解析;DOM采用的是樹形結(jié)構(gòu)的方式訪問XML文檔,而SAX采用的是事件模型;DOM解析把XML文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹,并可以對(duì)樹進(jìn)行遍歷,使用DOM解析器的時(shí)候需要處理整個(gè)XML文檔,所以對(duì)內(nèi)存和性能的要求比較高;SAX在解析XML文檔的時(shí)候可以觸發(fā)一系列的事件,當(dāng)發(fā)現(xiàn)給定的tag的時(shí)候,他可以激活一個(gè)回調(diào)方法,告訴該方法指定的標(biāo)簽已經(jīng)找到,SAX對(duì)內(nèi)存的要求通常會(huì)比較低,因?yàn)樗岄_發(fā)人員自己來決定所要處理的tag,特別是當(dāng)開發(fā)人員只需要處理文檔中所包含部分?jǐn)?shù)據(jù)時(shí),SAX這種擴(kuò)展能力得到了更好的體現(xiàn)。

11.對(duì)程序性能的優(yōu)化你有什么建議?

1.使用復(fù)用機(jī)制 2.盡可能設(shè)置 View 為不透明 3.避免臃腫的 XIB 文件 4.不要阻塞主線程 5.圖片尺寸匹配 UIImageView 6.選擇合適的容器 7.啟用 GZIP 數(shù)據(jù)壓縮 8.View 的復(fù)用和懶加載機(jī)制 9、緩存 服務(wù)器的響應(yīng)信息(response)。 圖片。 計(jì)算值。比如:UITableView 的 row heights。 10.關(guān)于圖形繪制 11.處理 Memory Warnings 在 AppDelegate 中實(shí)現(xiàn) - [AppDelegate applicationDidReceiveMemoryWarning:] 代理方法。 在 UIViewController 中重載 didReceiveMemoryWarning 方法。 監(jiān)聽 UIApplicationDidReceiveMemoryWarningNotification 通知。 12.復(fù)用高開銷的對(duì)象 13.減少離屏渲染(設(shè)置圓角和陰影的時(shí)候可以選用繪制的方法) 14.優(yōu)化 UITableView 通過正確的設(shè)置 reuseIdentifier 來重用 Cell。 盡量減少不必要的透明 View。 盡量避免漸變效果、圖片拉伸和離屏渲染。 當(dāng)不同的行的高度不一樣時(shí),盡量緩存它們的高度值。 如果 Cell 展示的內(nèi)容來自網(wǎng)絡(luò),確保用異步加載的方式來獲取數(shù)據(jù),并且緩存服務(wù)器的 response。 使用 shadowPath 來設(shè)置陰影效果。 盡量減少 subview 的數(shù)量,對(duì)于 subview 較多并且樣式多變的 Cell,可以考慮用異步繪制或重寫 drawRect。 盡量優(yōu)化 - [UITableView tableView:cellForRowAtIndexPath:] 方法中的處理邏輯,如果確實(shí)要做一些處理,可以考慮做一次,緩存結(jié)果。 選擇合適的數(shù)據(jù)結(jié)構(gòu)來承載數(shù)據(jù),不同的數(shù)據(jù)結(jié)構(gòu)對(duì)不同操作的開銷是存在差異的。 對(duì)于 rowHeight、sectionFooterHeight、sectionHeaderHeight 盡量使用常量。 15.選擇合適的數(shù)據(jù)存儲(chǔ)方式 在 iOS 中可以用來進(jìn)行數(shù)據(jù)持有化的方案包括: NSUserDefaults。只適合用來存小數(shù)據(jù)。 XML、JSON、Plist 等文件。JSON 和 XML 文件的差異在「選擇正確的數(shù)據(jù)格式」已經(jīng)說過了。 使用 NSCoding 來存檔。NSCoding 同樣是對(duì)文件進(jìn)行讀寫,所以它也會(huì)面臨必須加載整個(gè)文件才能繼續(xù)的問題。 使用 SQLite 數(shù)據(jù)庫??梢耘浜?FMDB 使用。數(shù)據(jù)的相對(duì)文件來說還是好處很多的,比如可以按需取數(shù)據(jù)、不用暴力查找等等。 使用 CoreData。也是數(shù)據(jù)庫技術(shù),跟 SQLite 的性能差異比較小。但是 CoreData 是一個(gè)對(duì)象圖譜模型,顯得更面向?qū)ο?;SQLite 就是常規(guī)的 DBMS。 16.減少應(yīng)用啟動(dòng)時(shí)間 快速啟動(dòng)應(yīng)用對(duì)于用戶來說可以留下很好的印象。尤其是第一次使用時(shí)。 保證應(yīng)用快速啟動(dòng)的指導(dǎo)原則: 盡量將啟動(dòng)過程中的處理分拆成各個(gè)異步處理流,比如:網(wǎng)絡(luò)請求、數(shù)據(jù)庫訪問、數(shù)據(jù)解析等等。 避免臃腫的 XIB 文件,因?yàn)樗鼈儠?huì)在你的主線程中進(jìn)行加載。重申:Storyboard 沒這個(gè)問題,放心使用。 注意:在測試程序啟動(dòng)性能的時(shí)候,最好用與 Xcode 斷開連接的設(shè)備進(jìn)行測試。因?yàn)?watchdog 在使用 Xcode 進(jìn)行調(diào)試的時(shí)候是不會(huì)啟動(dòng)的。 17.使用 Autorelease Pool (內(nèi)存釋放池) 18.imageNamed 和 imageWithContentsOfFile

12.runloop 和線程有什么關(guān)系?

runloop與線程是一一對(duì)應(yīng)的,一個(gè)runloop對(duì)應(yīng)一個(gè)核心的線程,為什么說是核心的,是因?yàn)閞unloop是可以嵌套的,但是核心的只能有一個(gè),他們的關(guān)系保存在一個(gè)全局的字典里。 runloop是來管理線程的,當(dāng)線程的runloop被開啟后,線程會(huì)在執(zhí)行完任務(wù)后進(jìn)入休眠狀態(tài),有了任務(wù)就會(huì)被喚醒去執(zhí)行任務(wù)。 runloop在第一次獲取時(shí)被創(chuàng)建,在線程結(jié)束時(shí)被銷毀。 對(duì)于主線程來說,runloop在程序一啟動(dòng)就默認(rèn)創(chuàng)建好了。 對(duì)于子線程來說,runloop是懶加載的,只有當(dāng)我們使用的時(shí)候才會(huì)創(chuàng)建,所以在子線程用定時(shí)器要注意:確保子線程的runloop被創(chuàng)建,不然定時(shí)器不會(huì)回調(diào)。

13 介紹下layoutSubview和drawRect

layoutSubviews調(diào)用情況 init初始化UIView不會(huì)觸發(fā)調(diào)用 addSubview會(huì)觸發(fā)調(diào)用 改變view的width和height的時(shí)候回觸發(fā)調(diào)用 一個(gè)UIScrollView滾動(dòng)會(huì)觸發(fā)調(diào)用 旋轉(zhuǎn)screen會(huì)觸發(fā)調(diào)用 改變一個(gè)UIView大小的時(shí)候會(huì)觸發(fā)superView的layoutSubviews事件 直接調(diào)用setLayoutSubviews會(huì)觸發(fā)調(diào)用 -(void)viewWillAppear:(BOOL)animated會(huì)觸發(fā)一次調(diào)用 -(void)viewDidAppear:(BOOL)animated 看情況,可能有調(diào)用 drawRect調(diào)用情況 如果UIView沒有設(shè)置frame大小,直接導(dǎo)致drawRect不能被自動(dòng)調(diào)用。 drawRect在loadView和viewDidLoad這兩個(gè)方法之后調(diào)用 調(diào)用sizeToFit后自動(dòng)調(diào)用drawRect 通過設(shè)置contentMode值為UIViewContentModeRedraw。那么每次設(shè)置或者更改frame自動(dòng)調(diào)用drawRect。 直接調(diào)用setNeedsDisplay或者setNeedsDisplayInRect會(huì)觸發(fā)調(diào)用

14.寫個(gè)“標(biāo)準(zhǔn)“宏MIN,這個(gè)宏輸兩個(gè)參數(shù)并返回較小的那個(gè)

MIN(A,B) ((A) <= (B) ? (A) : (B))

15.類別有什么作用

1.擴(kuò)展已有的類(添加方法) 2.可以通過runtime添加屬性

  1. 什么是method swizzing?講 講你的使 場景以及使 時(shí)的注意事項(xiàng)

1.給擴(kuò)展添加屬性 2.替換系統(tǒng)方法的的實(shí)現(xiàn)

22.講講iOS事件響應(yīng)鏈的原理

1、響應(yīng)者鏈通常是由視圖(UIView)構(gòu)成的; 2、一個(gè)視圖的下一個(gè)響應(yīng)者是它視圖控制器(UIViewController)(如果有的話),然后再轉(zhuǎn)給它的父視圖(Super View); 3、視圖控制器(如果有的話)的下一個(gè)響應(yīng)者為其管理的視圖的父視圖; 4、單例的窗口(UIWindow)的內(nèi)容視圖將指向窗口本身作為它的下一個(gè)響應(yīng)者 需要指出的是,Cocoa Touch應(yīng)用不像Cocoa應(yīng)用,它只有一個(gè)UIWindow對(duì)象,因此整個(gè)響應(yīng)者鏈要簡單一點(diǎn); 5、單例的應(yīng)用(UIApplication)是一個(gè)響應(yīng)者鏈的終點(diǎn),它的下一個(gè)響應(yīng)者指向nil,以結(jié)束整個(gè)循環(huán)。

23.你在什么場景下會(huì)選擇使 Category

1.擴(kuò)展已有的類(添加方法)

24.UIview 和CAlayer 是什么關(guān)系? 你 CLayer做過什么?

  1. 首先UIView可以響應(yīng)事件,Layer不可以.
  2. UIView是CALayer的delegate 3. UIView主要處理事件,CALayer負(fù)責(zé)繪制就更好 4. 每個(gè) UIView 內(nèi)部都有一個(gè) CALayer 在背后提供內(nèi)容的繪制和顯示,并且 UIView 的尺寸樣式都由內(nèi)部的 Layer 所提供。兩者都有樹狀層級(jí)結(jié)構(gòu),layer 內(nèi)部有 SubLayers,View 內(nèi)部有 SubViews.但是 Layer 比 View 多了個(gè)AnchorPoint 創(chuàng)建隱式動(dòng)畫 繪制邊框圓角

25.如何處理UITableVier 中Cell 動(dòng)態(tài)計(jì)算高度的問題,都有哪些方案?

1、你的Cell要使用AutoLayout來布局約束這是必須的; 設(shè)置tableview的estimatedRowHeight為一個(gè)非零值,這個(gè)屬性是設(shè)置一個(gè)預(yù)估的高度值,不用太精確。 設(shè)置tableview的rowHeight屬性為UITableViewAutomaticDimension 2.第三方 UITableView+FDTemplateLayoutCell

26.AutoLayout 中的優(yōu)先級(jí)是什么? UIScrollView 中使用Autolayout 會(huì)出現(xiàn)什么問題?

代碼計(jì)算frame -> autoreszing(父控件和子控件的關(guān)系) -> autolayout(任何控件都可以產(chǎn)生關(guān)系) -> sizeclass 可以設(shè)置兩個(gè)看似有沖突的約束,但設(shè)置不同的優(yōu)先級(jí)之后就不會(huì)有沖突了,當(dāng)其中一個(gè)約束失效之后,另一個(gè)優(yōu)先級(jí)比較低的約束就會(huì)起作用

27.NSIRLConnection 和NSLRLSession 的區(qū)別是 么? NSURLProtocol是做什么的?

1.下載 NSURLConnection下載文件時(shí),先是將整個(gè)文件下載到內(nèi)存,然后再寫入到沙盒,如果文件比較大,就會(huì)出現(xiàn)內(nèi)存暴漲的情況。 而使用NSURLSessionUploadTask下載文件,會(huì)默認(rèn)下載到沙盒中的tem文件中,不會(huì)出現(xiàn)內(nèi)存暴漲的情況,但是在下載完成后會(huì)把tem中的臨時(shí)文件刪除,需要在初始化任務(wù)方法時(shí),在completionHandler回調(diào)中增加保存文件的代碼 2.請求方法的控制 NSURLConnection實(shí)例化對(duì)象,實(shí)例化開始,默認(rèn)請求就發(fā)送(同步發(fā)送),不需要調(diào)用start方法。而cancel可以停止請求的發(fā)送,停止后不能繼續(xù)訪問,需要?jiǎng)?chuàng)建新的請求。 NSURLSession有三個(gè)控制方法,取消(cancel)、暫停(suspend)、繼續(xù)(resume),暫停以后可以通過繼續(xù)恢復(fù)當(dāng)前的請求任務(wù)。 使用NSURLSession進(jìn)行斷點(diǎn)下載更加便捷. NSURLSession的構(gòu)造方法(sessionWithConfiguration:delegate:delegateQueue)中有一個(gè)NSURLSessionConfiguration類的參數(shù)可以設(shè)置配置信息,其決定了cookie,安全和高速緩存策略,最大主機(jī)連接數(shù),資源管理,網(wǎng)絡(luò)超時(shí)等配置。NSURLConnection不能進(jìn)行這個(gè)配置,相比較與NSURLConnection依賴與一個(gè)全局的配置對(duì)象,缺乏靈活性而言,NSURLSession有很大的改進(jìn)

28.怎么高效的實(shí)現(xiàn)控件的圓角效果

繪制圓角 -(UIImageView *)roundedRectImageViewWithCornerRadius:(CGFloat)cornerRadius { UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:cornerRadius]; CAShapeLayer *layer = [CAShapeLayer layer]; layer.path = bezierPath.CGPath; self.layer.mask = layer; return self; }

32.說說你了解weak屬性?

weak關(guān)鍵字在OC中屬于比較基礎(chǔ)的知識(shí)此特性表明該屬性定義了一種關(guān)系“非擁有關(guān)系”(nonowning relationship)。為這種屬性設(shè)置新值得時(shí),設(shè)置方法既不保留新值,也不釋放舊值。此特性同assign類似,然后在屬性所指的對(duì)象遭到摧毀時(shí),屬性值也會(huì)清空(nil out)。 弱引用,不決定對(duì)象的存亡。即使一個(gè)對(duì)象被持有無數(shù)個(gè)弱引用,只要沒有強(qiáng)引用指向它,那么還是會(huì)被清除。

33.假如Controller太臃腫,如何優(yōu)化?

1.將網(wǎng)絡(luò)請求抽象到單獨(dú)的類中 方便在基類中處理公共邏輯; 方便在基類中處理緩存邏輯,以及其它一些公共邏輯; 方便做對(duì)象的持久化。 2.將界面的封裝抽象到專門的類中 構(gòu)造專門的 UIView 的子類,來負(fù)責(zé)這些控件的拼裝。這是最徹底和優(yōu)雅的方式,不過稍微麻煩一些的是,你需要把這些控件的事件回調(diào)先接管,再都一一暴露回 Controller。 3.構(gòu)造 ViewModel 借鑒MVVM。具體做法就是將 ViewController 給 View 傳遞數(shù)據(jù)這個(gè)過程,抽象成構(gòu)造 ViewModel 的過程。 4.專門構(gòu)造存儲(chǔ)類 專門來處理本地?cái)?shù)據(jù)的存取。 5.整合常量

34.項(xiàng)目中網(wǎng)絡(luò)層如何做安全處理?

1.判斷API的調(diào)用請求是否來自于經(jīng)過授權(quán)的APP。如若不是則拒絕請求訪問 2.在數(shù)據(jù)請求的過程中進(jìn)行URL加密處理:防止反編譯,接口信息被靜態(tài)分析。 3.數(shù)據(jù)傳輸加密:對(duì)客戶端傳輸數(shù)據(jù)提供有效的加密方案,以防止網(wǎng)絡(luò)接口的攔截。 如果可以盡量使用HTTPS,可以有效的避免接口數(shù)據(jù)在傳輸中被攻擊。

35.main()之前的過程有哪些?

在iOS中 main.m 是我們所熟悉的程序入口。但是在在此之前其實(shí)程序以及做了很多事了。如系統(tǒng)會(huì)獲取dyld的路徑,并加載。加載程序中的依賴庫。調(diào)用所有的+ load方法,并返回main函數(shù)地址。

其他值得看的總結(jié):

1.直擊2020——iOS 面試題大全(補(bǔ)充完整版)

2.“新”攜程,阿里,騰訊iOS面試常見問題合集(附答案)

3.我是如何同時(shí)拿到阿里和騰訊offer的

BAT面試題

騰訊一面 1.使用了第三方庫, 有看它們是怎么實(shí)現(xiàn)的嗎? 2.強(qiáng)連通量算法了解嘛? 3.遇到tableView卡頓嘛?會(huì)造成卡頓的原因大致有哪些? 4.M、V、C相互通訊規(guī)則你知道的有哪些? 5.NStimer準(zhǔn)嗎?談?wù)勀愕目捶??如果不?zhǔn)該怎樣實(shí)現(xiàn)一個(gè)精確的NSTimer? 答案詳見:http://www.itdecent.cn/p/9cf497351118

騰訊二面: 1.編譯過程做了哪些事情; 2.字典大致實(shí)現(xiàn)原理; 3.block和函數(shù)指針的理解; 4.一般開始做一個(gè)項(xiàng)目,你的架構(gòu)是如何思考的? 5.你了解的UIKit結(jié)構(gòu)? 答案詳見:http://www.itdecent.cn/p/c8d11c0500b3

騰訊三面 1.OC你了解的鎖有哪些?在你回答基礎(chǔ)上進(jìn)行二次提問; 追問一:自旋和互斥對(duì)比? 追問二:用C/OC/C++,任選其一,實(shí)現(xiàn)自旋或互斥?口述即可! 2.內(nèi)存泄漏可能會(huì)出現(xiàn)的幾種原因,聊聊你的看法? 追問一:非OC對(duì)象如何處理? 追問二:若常用框架出現(xiàn)內(nèi)存泄漏如何處理? 3.容錯(cuò)處理你們一般是怎么做的? 4.項(xiàng)目開始容錯(cuò)處理沒做?如何防止攔截潛在的崩潰? 答案詳見:http://www.itdecent.cn/p/d1f1f5925962

阿里 1.dSYM你是如何分析的? 2.多線程有哪幾種?你更傾向于哪一種? 3.單例弊端? 4.如何把異步線程轉(zhuǎn)換成同步任務(wù)進(jìn)行單元測試? 5.介紹下App啟動(dòng)的完成過程? 6.比如App啟動(dòng)過慢,你可能想到的因素有哪些? 7.0x8badf00d表示是什么? 8.怎么防止反編譯? 9.說說你遇到到的技術(shù)難點(diǎn)? 10.說說你了解的第三方原理或底層知識(shí)? 答案詳見:http://url.cn/5oWSdgZ

聲明: 內(nèi)容只是為了促進(jìn)學(xué)習(xí),并不是為行業(yè)增加內(nèi)卷.希望各位不要把這些題目作為面試素材為難求職者.需要新面試題和求職簡歷可以直接評(píng)論或者加微信:uuzz0125。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容