這裏包含了去哪兒,滴滴,螞蟻金服,美團,今日頭條,快手以及其它公司的一些面試題,大部分面試官問的重複的問題不少,整體來講就是如下的面試題。面試
- 簡述iOS中的內存管理方式
iOS的內存管理用的是引用計數的方法,分爲MRC(手動引用計數)和ARC(自動引用計數)。算法
MRC:開發者手動地進行retain和release操做,對每一個對象的retainCount進行+1,-1操做,當retainCount爲0時,系統會自動釋放對象內存。數據庫
ARC:開發者經過聲明對象的屬性爲strong,weak,retain,assign來管理對象的引用計數,被strong和retain修飾的屬性變量系統會自動對所修飾變量的引用計數進行自增自減操做,一樣地,retainCount爲0時,系統會釋放對象內存。api
- block的分類,__block的做用,block循環引用產生的緣由及解決辦法
3.深拷貝與淺拷貝數組
深拷貝就是開闢一塊新的內存空間來存儲原來內存空間的內容,對象指針指向新的內存空間。淺拷貝只是從新生成一個指針,指向的仍是原來的內存空間。xcode
copy方法:若是是非可擴展類對象,則是淺拷貝。若是是可擴展類對象,則是深拷貝。瀏覽器
mutableCopy方法:不管是可擴展類對象仍是不可擴展類對象,都是深拷貝。緩存
注意:深拷貝和深複製不一樣,深拷貝的內存空間的元素仍是指向原地址,可是深複製會開闢新的內存空間從新複製子元素。安全
4.iOS中常見的屬性和默認的對象屬性服務器
常見屬性: atomic, nonatomic, assign, retain, strong, weak, copy, readonly, readwrite, unsafe_unretained, getter=, setter= 等。
默認屬性: 繼承於NSObject類的對象:(atomic, strong), 非繼承於NSObject類的對象:(atomic, assign)
屬性意義:
5.哪些屬性須要聲明成copy,爲何?
@interface ViewController ()
@property (nonatomic, copy)NSString *aStr;
@property (nonatomic, strong)NSString *bStr;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// [self buildUI];
[self testCode];
}
- (void)testCode{
NSMutableString *mutableStr = [NSMutableString stringWithFormat:@"%@", @"abc"];
self.aStr = mutableStr;
self.bStr = mutableStr;
[mutableStr appendString:@"123"];
NSLog(@"copy修飾的字符串:%@", self.aStr);
NSLog(@"strong修飾的字符串:%@", self.bStr);
}
複製代碼
打印結果:
2018-05-22 21:13:58.344883 TTFeedBackDemo[1224:245923] copy修飾的字符串:abc
2018-05-22 21:13:58.345004 TTFeedBackDemo[1224:245923] strong修飾的字符串:abc123
複製代碼
用了copy屬性修飾以後,能夠防止這些類型的對象被引用而且改變內容。
- 通知,代理,block,KVO的使用場景分別是什麼,有什麼區別?
通知: 適用於毫無關聯的頁面之間或者系統消息的傳遞,屬於一對多的信息傳遞關係。例如系統音量的改變,系統狀態的改變,應用模式的設置和改變,都比較適合用通知去傳遞信息。
代理: 一對一的信息傳遞方式,適用於相互關聯的頁面之間的信息傳遞,例如push和present出來的頁面和原頁面之間的信息傳遞。
block: 一對一的信息傳遞方式,效率會比代理要高(畢竟是直接取IMP指針的操做方式)。適用的場景和代理差很少,都是相互關聯頁面之間的頁面傳值。
KVO: 屬性監聽,監聽對象的某一屬性值的變化情況,當須要監聽對象屬性改變的時候使用。例如在UIScrollView中,監聽contentOffset,既能夠用KVO,也能夠用代理。可是其餘一些狀況,好比說UIWebView的加載進度,AVPlayer的播放進度,就只能用KVO來監聽了,不然獲取不到對應的屬性值。
- 簡述對OC中的isa指針的認識
isa指針:首先,貼出NSObject.h文件,你們宏觀感覺一下。
Ojective-C語言是基於C語言的封裝,它實現了將面向過程的語言向面向對象的語言的轉變。而OC中絕大部分類又是繼承於NSObject類的,因此研究清楚NSObject類的構成,對於理解OC語言頗有幫助。#include <objc/objc.h>
、#include <objc/NSObjCRuntime.h>
,第一個頭文件引入的是objc結構體的構成方式即isa指針,第二個頭文件引入的是Runtime消息查找機制。@class NSString, NSMethodSignature, NSInvocation;
+ (NSString *)description
方法有關。isa指針: 代碼以下
@interface NSObject <NSObject> {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
Class isa OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop
}
複製代碼
NSObject對象其實包含了一個Class類型的isa指針。 這個和id類型是同樣的,代碼以下:
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
複製代碼
即id類型實際上是objc_object指針類型的別稱。objc_object結構體一樣也是包含了一個指向Class類型的指針。 繼續看一下,Class isa指針的內部結構,以下
struct objc_class {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;//指向元類的Class指針
#if !__OBJC2__
Class _Nullable super_class OBJC2_UNAVAILABLE;//指向父類的Class指針
const char * _Nonnull name OBJC2_UNAVAILABLE;//類名
long version OBJC2_UNAVAILABLE;//類的版本信息,默認爲0
long info OBJC2_UNAVAILABLE;//運行期使用的一些位標識
long instance_size OBJC2_UNAVAILABLE;//該類的實例變量大小
struct objc_ivar_list * _Nullable ivars OBJC2_UNAVAILABLE;//屬性列表
struct objc_method_list * _Nullable * _Nullable methodLists OBJC2_UNAVAILABLE;//方法列表
struct objc_cache * _Nonnull cache OBJC2_UNAVAILABLE;//緩存方法列表
struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE;//協議列表
#endif
} OBJC2_UNAVAILABLE;
typedef struct objc_class *Class;
複製代碼
Class其實就是一個objc_class類型的結構體指針。objc_class的結構體變量構成見上圖,下面是objc_class類的super_class指針和isa元類指針的具體指向關係,請你們分清對象,對象的類,元類,根元類這些概念。
- 簡述OC中的消息轉發機制
當objc_msgSend方法調用找不到響應的函數名稱時就會進行消息轉發,主要分爲3步:
調用方法+(BOOL)resolveInstanceMethod:(SEL)sel
(實例方法動態解析)和+ (BOOL)resolveClassMethod:(SEL)sel
(類方法動態解析)。
調用方法 - (id)forwardingTargetForSelector:(SEL)aSelector
調用方法- (void)forwardInvocation:(NSInvocation *)anInvocation
和- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
具體的轉發流程見下圖:
- 響應鏈原理
當用戶觸摸屏幕時,觸碰屏幕產生事件UIEvent並存入UIApplication中的事件隊列中, 而且在整個視圖結構中自上而下的進行分發,以下圖所示:
這裏着重介紹兩個方法
//判斷當前點擊事件是否存在最優響應者(First Responder)
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
複製代碼
//判斷當前點擊是否在控件的Bounds以內
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
複製代碼
第一個方法返回一個能夠響應event觸摸事件的UIView,第二個方法判斷觸摸點位在不在可相應範圍以內的BOOL值。因此會衍生出一些問題,好比說「如何讓一個父視圖之外的子視圖響應點擊事件」,「如何只讓一個UIView的圓形區域響應觸摸事件」等等,在此因爲篇幅限制,再也不一一展開詳述。下面這幅圖簡述了系統查找響應事件控件的流程。
- 手寫一個block結構體聲明
typedef void(^RBBlogDemoHandler)(void);
- RunLoop原理,RunLoop與線程的關係
- GCD與NSOperation兩種管理多線程方式的異同點
- GCD的經常使用api
- GCD中的同步異步,串行併發的概念,GCD常見的線程死鎖問題
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@", @"123");
});
複製代碼
這樣的函數,就是典型的GCD死鎖函數。 由於dispatch_sync阻塞的當前的線程,而當前線程是main_queue,也就是說是一個串行線程,當前線程只有先執行NSLog(@"%@", @"123")
才能繼續運行下去,可是當前線程又被阻塞掉了,沒法向下繼續執行,因此這就是一個死鎖的GCD執行函數了。
- iOS中經常使用的線程鎖有哪些,分別具備哪些特色?
dispatch_barrier_async
/dispatch_barrier_sync
,dispatch_barrier_async
/dispatch_barrier_sync
在必定的基礎上也能夠作線程同步,會在線程隊列中打斷其餘線程執行當前任務。兩個的區別是dispatch_barrier_async阻塞的是當前隊列的線程,而dispatch_barrier_sync阻塞的是任務所插入隊列的線程。
- Father的子類Son,分別寫出
NSStringFromClass([self class])
,NSStringFromClass([super class])
,NSStringFromClass(self.superClass)
的打印值
- KVO的原理
willChangeValueForKey:
(值改變以前)和didChangevlueForKey:
(值改變以後)。在一個被觀察屬性發生改變以前,willChangeValueForKey:
必定會被調用,這就會記錄舊的值。而當改變發生後,didChangeValueForKey:
會被調用,繼而observeValueForKey:ofObject:change:context:
也會被調用。
- runtime的機制和應用
19.MJExtension, MJRefresh, SDWebImage的實現原理
- NSTimer計時器是準確的嗎,爲何?
- 類的分類和類的擴展的區別,類的分類的實現原理。
- iOS動態關聯屬性(
objc_setAssociatedObject
,objc_getAssocicatedObject
)的實現原理
- Masonry的抗壓縮屬性和抗拉伸屬性
[label1 setContentHuggingPriority:UILayoutPriorityRequired
forAxis:UILayoutConstraintAxisHorizontal];
[label2 setContentHuggingPriority:UILayoutPriorityDefaultLow
forAxis:UILayoutConstraintAxisHorizontal];
複製代碼
[label1 setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
forAxis:UILayoutConstraintAxisHorizontal];
[label2 setContentCompressionResistancePriority:UILayoutPriorityRequired
forAxis:UILayoutConstraintAxisHorizontal];
複製代碼
- 加密的種類,對稱加密和非對稱加密
- 解釋一下七層網絡結構,三次握手協議和四次揮手協議
七層網絡協議:
三次握手協議:
四次揮手協議:
- http和https的區別
- https雙向驗證原理
- HTTP經常使用的頭部字段,常見的返回狀態碼和意義
常見的頭部字段:
返回的狀態碼:
- @class和import以及include的區別
- weak對象的管理方式
weak是弱引用,所引用對象的計數器不會加一,並在引用對象被釋放的時候自動被設置爲nil。runtime維護了一個weak表,用於存儲指向某個對象的全部weak指針。weak表實際上是一個hash(哈希)表,Key是所指對象的地址,Value是weak指針的地址(這個地址的值是所指對象的地址)數組。
一、初始化時:runtime會調用objc_initWeak函數,初始化一個新的weak指針指向對象的地址。
二、添加引用時:objc_initWeak函數會調用 objc_storeWeak() 函數, objc_storeWeak() 的做用是更新指針指向,建立對應的弱引用表。
三、釋放時,調用clearDeallocating函數。clearDeallocating函數首先根據對象地址獲取全部weak指針地址的數組,而後遍歷這個數組把其中的數據設爲nil,最後把這個entry從weak表中刪除,最後清理對象的記錄。
- iOS的retain和release的操做是在編譯期仍是運行時進行的
- (void) setUserName:(UITextField *)userName {
[_userName release];
_userName = [userName retain];
}
複製代碼
- +(void)load方法和+(void)initial方法的異同
當一個視圖控制器被建立,並在屏幕上現實的時候。代碼的執行順序:
當一個視圖被移除屏幕而且銷燬的時候執行順序:
- iOS中各種控件的繼承樹關係
- 如何化解NSTimer的循環引用關係
- 怎樣管理第三方SDK,CocoaPods和Carthage的異同
iOS中通常使用CocoaPods和Carthage來管理第三方SDK。
二者的比較:
- -(BOOL)isKindOfClass和-(BOOL)isMemberOfClass的區別
-(BOOL) isKindOfClass: classObj 判斷是不是這個類或者這個類的子類的實例
-(BOOL) isMemberOfClass: classObj 判斷是不是這個類的實例
- 數據持久化的幾種方式和對應的應用場景
- 如何實現一個完整的單例
#import "Singleton.h"
@interface Singleton()<NSCopying,NSMutableCopying>
@end
@implementation Singleton
static Singleton* _instance = nil;
+(instancetype) shareInstance
{
static dispatch_once_t onceToken ;
dispatch_once(&onceToken, ^{
_instance = [[super allocWithZone:NULL] init] ;
//不是使用alloc方法,而是調用[[super allocWithZone:NULL] init]
//已經重載allocWithZone基本的對象分配方法,因此要借用父類(NSObject)的功能來幫助出處理底層內存分配的雜物
}) ;
return _instance ;
}
+(id) allocWithZone:(struct _NSZone *)zone
{
return [Singleton shareInstance] ;
}
-(id) copyWithZone:(NSZone *)zone
{
return [Singleton shareInstance] ;//return _instance;
}
-(id) mutablecopyWithZone:(NSZone *)zone
{
return [Singleton shareInstance] ;
}
@end
複製代碼
- iOS的系統單例有哪些?
[UIScreen mainScreen] (應用程序窗口)
[UIDevice currentDevice] (當前設備)
[UIApplication sharedApplication] (應用程序實例)
[NSNotificationCenter defaultCenter] (消息中心):
[NSFileManager defaultManager] (文件管理):
[NSUserDefaults standardUserDefaults] (應用程序設置):
[NSURLCache sharedURLCache] (請求緩存):
[NSHTTPCookieStorage sharedHTTPCookieStorage] (應用程序cookies池)
- APP啓動主要流程
- iOS的沙盒機制
出於安全考慮,iPhone對於安裝在上面的應用程序有所限制,這個限制就是應用程序只能在爲該改程序建立的文件系統中讀取文件,不能夠去其它地方訪問,此區域被成爲沙盒,因此全部的非代碼文件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件等。整體來講沙盒就是一種獨立、安全、封閉的空間。沙盒(sandbox)的核心內容是:sandbox對應用程序執行各類操做的權限限制。
沙盒的特色:
應用程序沙盒目錄下有三個文件夾Documents、Library(下面有Caches和Preferences目錄)、tmp。