2020年iOS大廠面試題總結(jié)

文章目錄

2020年IOS面試題總結(jié)(一)
1. ios內(nèi)存管理機制
2. NSThread沟突、GCD卢未、NSOperation多線程
3.輸入一個字符串,判斷這個字符串是否是有效的IP地址
4.大數(shù)加法怎么實現(xiàn)?
5.簡述KVC和KVO她混,其中KVO實現(xiàn)原理联贩?
6.Block實現(xiàn)原理漫仆;堆上和棧上的數(shù)據(jù)如何同步?
7.iOS設計模式
8.多線程有哪些泪幌?如何保證多線程中讀寫分離盲厌,加鎖方案署照?
9.如何刪除單鏈表中一個元素?
10.NSNotificationCenter通知中心的實現(xiàn)原理吗浩?
11.推送如何實現(xiàn)的建芙?
12.SEL的使用和原理?
13.點擊事件如何穿透透明的View?
14.RunLoop的實現(xiàn)原理懂扼?(答案待完善)
15.簡述Runtime禁荸,發(fā)送消息的過程;
16.簡述weak的實現(xiàn)原理阀湿;
17.寫一個單例赶熟;
18.如何從字符串中得到一個整數(shù)?
19.數(shù)組去重方式陷嘴;
20.設計一個數(shù)據(jù)庫映砖;(答案待完善)
21.實現(xiàn)多個網(wǎng)絡請求ABC執(zhí)行完再執(zhí)行D
22.列表頁性能優(yōu)化
23.HTTPS(答案待完善)
23.音視頻相關

1. ios內(nèi)存管理機制

iOS內(nèi)存管理機制的原理是引用計數(shù),當這塊內(nèi)存被創(chuàng)建后灾挨,它的引用計數(shù)0->1邑退,表示有一個對象或指針持有這塊內(nèi)存,擁有這塊內(nèi)存的所有權劳澄,如果這時候有另外一個對象或指針指向這塊內(nèi)存地技,那么為了表示這個后來的對象或指針對這塊內(nèi)存的所有權,引用計數(shù)1->2浴骂,之后若有一個對象或指針不再指向這塊內(nèi)存時乓土,引用計數(shù)-1,表示這個對象或指針不再擁有這塊內(nèi)存的所有權溯警,當一塊內(nèi)存的引用計數(shù)變?yōu)?趣苏,表示沒有任何對象或指針持有這塊內(nèi)存,系統(tǒng)便會立刻釋放掉這塊內(nèi)存梯轻。

alloc食磕、new :類初始化方法,開辟新的內(nèi)存空間喳挑,引用計數(shù)+1彬伦;
retain :實例方法,不會開辟新的內(nèi)存空間伊诵,引用計數(shù)+1单绑;
copy : 實例方法,把一個對象復制到新的內(nèi)存空間曹宴,新的內(nèi)存空間引用計數(shù)+1搂橙,舊的不會;其中分為淺拷貝和深拷貝笛坦,淺拷貝只是拷貝地址区转,不會開辟新的內(nèi)存空間苔巨;深拷貝是拷貝內(nèi)容,會開辟新的內(nèi)存空間废离;
strong :強引用侄泽; 引用計數(shù)+1;
release :實例方法蜻韭,釋放對象悼尾;引用計數(shù)-1;
autorelease : 延遲釋放肖方;autoreleasepool自動釋放池诀豁;當執(zhí)行完之后引用計數(shù)-1;
還有是initWithFormat和stringWithFormat 字符串長度大于9時窥妇,引用計數(shù)+1;
assign : 弱引用 娩践;weak也是弱引用活翩,兩者區(qū)別:assign不但能作用于對象還能作用于基本數(shù)據(jù)類型,但是所指向的對象銷毀時不會將當前指向?qū)ο蟮闹羔樦赶騨il翻伺,有野指針的生成材泄;weak只能作用于對象,不能作用于基本數(shù)據(jù)類型吨岭,所指向的對象銷毀時會將當前指向?qū)ο蟮闹羔樦赶騨il拉宗,防止野指針的生成。

2. NSThread辣辫、GCD旦事、NSOperation多線程

1、NSThread

NSThread是封裝程度最小最輕量級的急灭,使用更靈活姐浮,但要手動管理線程的生命周期、線程同步和線程加鎖等葬馋,開銷較大卖鲤;

1|[NSThread isMultiThreaded];//BOOL 是否開啟了多線程    
2|[NSThread currentThread];//NSThread 獲取當前線程    
3|[NSThread mainThread];//NSThread 獲取主線程    
4|[NSThread sleepForTimeInterval:1];//線程睡眠1s
5|

2、GCD

GCD基于C語言封裝的畴嘶,遵循FIFO

1dispatch_sync與dispatch_async//同步和異步操作
2
3dispatch_queue_t;//主要有串行和并發(fā)兩種蛋逾;
4    其中:
5    dispatch_queue_create("concurrent_queue", DISPATCH_QUEUE_CONCURRENT)并發(fā);
6    dispatch_queue_create("serial_queue", DISPATCH_QUEUE_SERIAL)串行窗悯;
7
8dispatch_once_t;//代碼只會被執(zhí)行一次,用于單例
9dispatch_after区匣;//延遲操作
10dispatch_get_main_queue;//回到主線程操作
11
12
13//Demo單例
14+ (instancetype)sharedInstance {
15    static ZZScreenshotsMonitor *instance = nil;
16    static dispatch_once_t onceToken;
17    dispatch_once(&onceToken, ^{
18        instance = [[self alloc] init];
19    });
20    return instance;
21}
22    
23
24
25//Demo:執(zhí)行順序
26- (void)viewDidLoad {
27    [super viewDidLoad];
28    dispatch_async(dispatch_get_main_queue(), ^{
29        NSLog(@"1");
30    });
31    
32    NSLog(@"2");33
34    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
35    
36    dispatch_sync(queue, ^{
37        NSLog(@"3");
38    });
39    
40    dispatch_async(dispatch_get_main_queue(), ^{
41
        NSLog(@"4");
42    });
43    
44    dispatch_async(queue, ^{
45        NSLog(@"5");
46    });
47    
48    NSLog(@"6");
49    
50    [self performSelector:@selector(delayMethod) withObject:nil afterDelay:0];
51    
52    NSLog(@"8");
53}
54    
55- (void)delayMethod {
56
57}
58

59打印結(jié)果:23658147;其中5和8隨機調(diào)換
60
61

NSOperation

NSOperation基于GCD封裝的蟀瞧,比GCD可控性更強;可以加入操作依賴(addDependency)沉颂、設置操作隊列最大可并發(fā)執(zhí)行的操作個數(shù)(setMaxConcurrentOperationCount)条摸、取消操作(cancel)等,需要使用兩個它的實體子類:NSBlockOperation和NSInvocationOperation,或者繼承NSOperation自定義子類;NSBlockOperation和NSInvocationOperation用法的主要區(qū)別是:前者執(zhí)行指定的方法铸屉,后者執(zhí)行代碼塊钉蒲,相對來說后者更加靈活易用。NSOperation操作配置完成后便可調(diào)用start函數(shù)在當前線程執(zhí)行彻坛,如果要異步執(zhí)行避免阻塞當前線程則可以加入NSOperationQueue中異步執(zhí)行

作為一個開發(fā)者顷啼,有一個學習的氛圍跟一個交流圈子特別重要,這是一個我的點擊加入群聊iOS交流群:789143298 進群密碼123昌屉,不管你是小白還是大牛歡迎入駐 钙蒙,分享BAT,阿里面試題、面試經(jīng)驗间驮,討論技術躬厌,
大家一起交流學習成長!

image

3.輸入一個字符串竞帽,判斷這個字符串是否是有效的IP地址

1+ (BOOL)isValidIP:(NSString *)ipStr {
2    if (nil == ipStr) {
3        return NO;
4    }
5    
6    NSArray *ipArray = [ipStr componentsSeparatedByString:@"."];
7    if (ipArray.count == 4) {
8        for (NSString *ipnumberStr in ipArray) {
9             if ([self isPureInt:ipnumberStr]) {
10                int ipnumber = [ipnumberStr intValue];
11              if (!(ipnumber>=0 && ipnumber<=255)) {
12                  return NO;
13              }
14            }
15        }
16        return YES;
17    }
18    return NO;
19}
20//是否整形
21- (BOOL)isPureInt:(NSString*)string {
22  NSScanner* scan = [NSScanner scannerWithString:string];
23  int val;
24  return[scan scanInt:&val] && [scan isAtEnd];
25}
26//是否只含有數(shù)字
27- (BOOL)validateNumber:(NSString*)number {
28  BOOL res = YES;
29  NSCharacterSet* tmpSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
30  int i = 0;
31  while (i < number.length) {
32      NSString * string = [number substringWithRange:NSMakeRange(i, 1)];
33      NSRange range = [string rangeOfCharacterFromSet:tmpSet];
34      if (range.length == 0) {
35          res = NO;
36          break;
37      }
38      I++;
39  }
40  return res;
41
42}
43
44

4.大數(shù)加法怎么實現(xiàn)扛施?

使用字符串實現(xiàn);

1/兩個大數(shù)相加算法
2-(NSString *)addTwoNumberWithOneNumStr:(NSString *)one anotherNumStr:(NSString *)another
3{
4    int i = 0;
5    int j = 0;
6    int maxLength = 0;
7    int sum = 0;
8    int overflow = 0;
9    int carryBit = 0;
10    NSString *temp1 = @"";
11    NSString *temp2 = @"";
12    NSString *sums = @"";
13    NSString *tempSum = @"";
14    int length1 = (int)one.length;
15    int length2 = (int)another.length;
16    //1.反轉(zhuǎn)字符串
17    for (i = length1 - 1; i >= 0 ; i--) {
18        NSRange range = NSMakeRange(i, 1);
19        temp1 = [temp1 stringByAppendingString:[one substringWithRange:range]];
20        NSLog(@"%@",temp1);
21    }
22    for (j = length2 - 1; j >= 0; j--) {
23        NSRange range = NSMakeRange(j, 1);
24        temp2 = [temp2 stringByAppendingString:[another substringWithRange:range]];
25        NSLog(@"%@",temp2);
26    }
27    
28    //2.補全缺少位數(shù)為0
29    maxLength = length1 > length2 ? length1 : length2;
30    if (maxLength == length1) {
31        for (i = length2; i < length1; i++) {
32            temp2 = [temp2 stringByAppendingString:@"0"];
33            NSLog(@"i = %d --%@",i,temp2);
34        }
35    }else{
36        for (j = length1; j < length2; j++) {
37            temp1 = [temp1 stringByAppendingString:@"0"];
38            NSLog(@"j = %d --%@",j,temp1);
39        }
40    }
41    //3.取數(shù)做加法
42    for (i = 0; i < maxLength; i++) {
43        NSRange range = NSMakeRange(i, 1);
44        int a = [temp1 substringWithRange:range].intValue;
45        int b = [temp2 substringWithRange:range].intValue;
46        sum = a + b + carryBit;
47        if (sum > 9) {
48            if (i == maxLength -1) {
49                overflow = 1;
50            }
51            carryBit = 1;
52            sum -= 10;
53        }else{
54            carryBit = 0;
55        }
56        tempSum = [tempSum stringByAppendingString:[NSString stringWithFormat:@"%d",sum]];
57    }
58    if (overflow == 1) {
59        tempSum = [tempSum stringByAppendingString:@"1"];
60    }
61    int sumlength = (int)tempSum.length;
62    for (i = sumlength - 1; i >= 0 ; i--) {
63        NSRange range = NSMakeRange(i, 1);
64        sums = [sums stringByAppendingString:[tempSum substringWithRange:range]];
65    }
66    NSLog(@"sums = %@",sums);
67    return sums;
68}

5.簡述KVC和KVO屹篓,其中KVO實現(xiàn)原理疙渣?

KVC : 鍵值編碼(Key-Value Coding),它是一種通過key值訪問類屬性的機制,而不是通過setter/getter方法訪問堆巧。其中 KVC 原理:當調(diào)用- (void)setValue:(id)value forUndefinedKey:(NSString *)key時妄荔,KVC底層的執(zhí)行機制如下:
首先搜索對應屬性的setter方法
如果沒有找到屬性的setter方法,則會檢查+ (BOOL)accessInstanceVariablesDirectly方法是否返回了YES(該方法默認返回YES),如果返回了YES, 則KVC機制會搜索類中是否存在該屬性的成員變量谍肤,也就是_屬性名啦租,存在則對該成員變量賦值。搜索成員變量名的順序是 _key谣沸,_isKey刷钢,key,isKey乳附。
另外我們也可以通過重寫+ (BOOL)accessInstanceVariablesDirectly方法返回NO,這個時候KVC機制就會調(diào)用 - (void)setValue:(id)value forUndefinedKey:(NSString *)key内地。
如果沒有找到成員變量,調(diào)用 - (void)setValue:(id)value forUndefinedKey:(NSString *)key赋除。

KVO : 鍵值觀察者 (Key-Value Observer): KVO 是觀察者模式的一種實現(xiàn)阱缓,觀察者A監(jiān)聽被觀察者B的某個屬性,當B的屬性發(fā)生更改時举农,A就會收到通知荆针,執(zhí)行相應的方法。實現(xiàn)原理:基本的原理:當觀察某對象A時,KVO機制動態(tài)創(chuàng)建一個對象A當前類的子類航背,并為這個新的子類重寫了被觀察屬性keyPath的setter 方法喉悴。setter 方法隨后負責通知觀察對象屬性的改變狀況。

6.Block實現(xiàn)原理玖媚;堆上和棧上的數(shù)據(jù)如何同步箕肃?

block本質(zhì)上也是一個oc對象,他內(nèi)部也有一個isa指針今魔。block是封裝了函數(shù)調(diào)用以及函數(shù)調(diào)用環(huán)境的OC對象勺像。結(jié)構體,在棧上的情況, Block中的指針只是指向棧上的__block變量, 而當Block/__block變量被copy到堆上以后, 堆上Block會持有堆上__block變量. 而堆上的Block再次被調(diào)用copy時, 只是Block的引用計數(shù)+1而已, 而__block變量如果被多個堆上Block持有也只涉及到引用記數(shù)的變化. 一旦Block/__block變量的引用計數(shù)為0, 就會自動從堆上釋放內(nèi)存.這里Block/__block變量在堆上的內(nèi)存管理與Objective-C對象完全一致.

1 Block類                    原存儲域    調(diào)用copy效果
2 _NSConcreteStackBlock 棧           從棧copy到堆
3 _NSConcreteGlobalBlock    數(shù)據(jù)域(.data域) 什么也不做
4 _NSConcreteMallocBlock    堆           引用計數(shù)+1

7.iOS設計模式

適配器模式错森;

1:何為適配器模式吟宦?
適配器模式將一個類的接口適配成用戶所期待的。一個適配器通常允許因為接口不兼容而不能一起工作的類能夠在一起工作涩维,做法是將類自己的接口包裹在一個已存在的類中殃姓。
2:[如何使用適配器模式?]
當你想使用一個已經(jīng)存在的類瓦阐,而它的接口不符合你的需求辰狡;
你想創(chuàng)建一個可以復用的類,該類可以與其他不相關的類或不可預見的類協(xié)同工作垄分;
你想使用一些已經(jīng)存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口娃磺,對象適配器可以適配它的父親接口薄湿。
3:[適配器模式的優(yōu)缺點?]
優(yōu)點:降低數(shù)據(jù)層和視圖層(對象)的耦合度偷卧,使之使用更加廣泛豺瘤,適應復雜多變的變化。
缺點:降低了可讀性听诸,代碼量增加坐求,對于不理解這種模式的人來說比較難看懂。

策略模式;

1:何為策略模式晌梨?策略模式定義了一系列的算法桥嗤,并將每一個算法封裝起來,而且使它們還可以相互替換仔蝌。策略模式讓算法獨立于使用它的客戶而獨立變化泛领。
2:如何使用策略模式?
在有多種算法相似的情況下敛惊,使用 if…else 所帶來的復雜和難以維護渊鞋。
如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為锡宋。
一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種儡湾。
如果一個對象有很多的行為,如果不用恰當?shù)哪J街戳@些行為就只好使用多重的條件選擇語句來實現(xiàn)徐钠。
注意事項:如果一個系統(tǒng)的策略多于四個,就需要考慮使用混合模式奠滑,解決策略類膨脹的問題丹皱。
3:策略模式的優(yōu)缺點?
優(yōu)點:簡化操作宋税,提高代碼維護性摊崭。算法可以自由切換,避免使用多重條件判斷杰赛,擴展性良好呢簸。
缺點:在使用之前就要確定使用某種策略,而不是動態(tài)的選擇策略乏屯。策略類會增多根时,所有策略類都需要對外暴露。

觀察者模式;

1:[何為觀察者模式辰晕?]
當對象間存在一對多關系時蛤迎,則使用觀察者模式(Observer Pattern)。比如含友,當一個對象被修改時替裆,則會自動通知它的依賴對象。觀察者模式屬于行為型模式窘问。
2:如何使用觀察者模式辆童?
一個對象狀態(tài)改變給其他對象通知的問題,而且要考慮到易用和低耦合惠赫,保證高度的協(xié)作把鉴。一個對象(目標對象)的狀態(tài)發(fā)生改變,所有的依賴對象(觀察者對象)都將得到通知儿咱,進行廣播通知庭砍。
3:觀察者模式的優(yōu)缺點?
優(yōu)點:觀察者和被觀察者是抽象耦合的混埠。建立一套觸發(fā)機制逗威。缺點:如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間岔冀。如果在觀察者和觀察目標之間有循環(huán)依賴的話凯旭,觀察目標會觸發(fā)它們之間進行循環(huán)調(diào)用概耻,可能導致系統(tǒng)崩潰。觀察者模式?jīng)]有相應的機制讓觀察者知道所觀察的目標對象是怎么發(fā)生變化的罐呼,而僅僅只是知道觀察目標發(fā)生了變化鞠柄。

原型/外觀模式;

1:何為原型/外觀模式?
原型模式:(Prototype Pattern)用于創(chuàng)建重復的對象嫉柴,同時又能保證性能厌杜。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式计螺。這種模式是實現(xiàn)了一個原型接口夯尽,該接口用于創(chuàng)建當前對象的克隆。當直接創(chuàng)建對象的代價比較大時登馒,則采用這種模式匙握。
外觀模式:(Facade Pattern)隱藏系統(tǒng)的復雜性,并向客戶端提供了一個客戶端可以訪問系統(tǒng)的接口陈轿。這種類型的設計模式屬于結(jié)構型模式圈纺,它向現(xiàn)有的系統(tǒng)添加一個接口,來隱藏系統(tǒng)的復雜性麦射。這種模式涉及到一個單一的類蛾娶,該類提供了客戶端請求的簡化方法和對現(xiàn)有系統(tǒng)類方法的委托調(diào)用。
2:如何使用原型/外觀模式潜秋?
原型模式:
當一個系統(tǒng)應該獨立于它的產(chǎn)品創(chuàng)建蛔琅,構成和表示時。
當要實例化的類是在運行時刻指定時峻呛,例如揍愁,通過動態(tài)裝載。
為了避免創(chuàng)建一個與產(chǎn)品類層次平行的工廠類層次時杀饵。
當一個類的實例只能有幾個不同狀態(tài)組合中的一種時。建立相應數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實例化該類更方便一些谬擦。
外觀模式:
客戶端不需要知道系統(tǒng)內(nèi)部的復雜聯(lián)系切距,整個系統(tǒng)只需提供一個"接待員"即可。
定義系統(tǒng)的入口惨远。
3:原型/外觀模式的優(yōu)缺點谜悟?
原型模式:
優(yōu)點:性能提高,逃避構造函數(shù)的約束北秽。
缺點:
配備克隆方法需要對類的功能進行通盤考慮葡幸,這對于全新的類不是很難,但對于已有的類不一定很容易贺氓。
必須實現(xiàn) Cloneable 接口蔚叨。
逃避構造函數(shù)的約束。
外觀模式
優(yōu)點:減少系統(tǒng)相互依賴、提高靈活性蔑水、提高了安全性邢锯。
缺點:不符合開閉原則笤喳,如果要改東西很麻煩窥淆,繼承重寫都不合適牢贸。

工廠模式;

1:何為工廠模式蓬痒?
這種類型的設計模式屬于創(chuàng)建型模式蹬音,它提供了一種創(chuàng)建對象的最佳方式派草。
在工廠模式中贝润,我們在創(chuàng)建對象時不會對客戶端暴露創(chuàng)建邏輯奠伪,并且是通過使用一個共同的接口來指向新創(chuàng)建的對象榜苫。
2:如何使用工廠模式护戳?
我們明確地計劃不同條件下創(chuàng)建不同實例時。
作為一種創(chuàng)建類模式单刁,在任何需要生成復雜對象的地方灸异,都可以使用工廠方法模式。有一點需要注意的地方就是復雜對象適合使用工廠模式羔飞,而簡單對象肺樟,特別是只需要通過 new 就可以完成創(chuàng)建的對象,無需使用工廠模式逻淌。如果使用工廠模式么伯,就需要引入一個工廠類,會增加系統(tǒng)的復雜度卡儒。
3:工廠模式的優(yōu)缺點田柔?
優(yōu)點:
一個調(diào)用者想創(chuàng)建一個對象,只要知道其名稱就可以了骨望。
擴展性高硬爆,如果想增加一個產(chǎn)品,只要擴展一個工廠類就可以擎鸠。
屏蔽產(chǎn)品的具體實現(xiàn)缀磕,調(diào)用者只關心產(chǎn)品的接口。
缺點:
每次增加一個產(chǎn)品時劣光,都需要增加一個具體類和對象實現(xiàn)工廠袜蚕,使得系統(tǒng)中類的個數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復雜度绢涡,同時也增加了系統(tǒng)具體類的依賴牲剃。這并不是什么好事。

橋接模式;

1:何為橋接模式雄可?
橋接(Bridge)是用于把抽象化與實現(xiàn)化解耦凿傅,使得二者可以獨立變化缠犀。這種類型的設計模式屬于結(jié)構型模式,它通過提供抽象化和實現(xiàn)化之間的橋接結(jié)構狭归,來實現(xiàn)二者的解耦夭坪。
這種模式涉及到一個作為橋接的接口,使得實體類的功能獨立于接口實現(xiàn)類过椎。這兩種類型的類可被結(jié)構化改變而互不影響室梅。
2:如何使用橋接模式?
在有多種可能會變化的情況下疚宇,用繼承會造成類爆炸問題亡鼠,擴展起來不靈活。
實現(xiàn)系統(tǒng)可能有多個角度分類敷待,每一種角度都可能變化间涵。
把這種多角度分類分離出來,讓它們獨立變化榜揖,減少它們之間耦合勾哩。
3:橋接模式的優(yōu)缺點?
優(yōu)點 :抽象和實現(xiàn)的分離举哟、優(yōu)秀的擴展能力思劳、實現(xiàn)細節(jié)對客戶透明。
缺點:橋接模式的引入會增加系統(tǒng)的理解與設計難度妨猩,由于聚合關聯(lián)關系建立在抽象層潜叛,要求開發(fā)者針對抽象進行設計與編程。

代理模式;

1:何為代理模式壶硅?
在代理模式(Proxy Pattern)中威兜,一個類代表另一個類的功能。這種類型的設計模式屬于結(jié)構型模式庐椒。
在代理模式中椒舵,我們創(chuàng)建具有現(xiàn)有對象的對象,以便向外界提供功能接口约谈。
2:如何使用代理模式笔宿?
在直接訪問對象時帶來的問題,比如說:要訪問的對象在遠程的機器上窗宇。在面向?qū)ο笙到y(tǒng)中,有些對象由于某些原因(比如對象創(chuàng)建開銷很大特纤,或者某些操作需要安全控制军俊,或者需要進程外的訪問),直接訪問會給使用者或者系統(tǒng)結(jié)構帶來很多麻煩捧存,我們可以在訪問此對象時加上一個對此對象的訪問層粪躬。
想在訪問一個類時做一些控制担败。
3:代理模式的優(yōu)缺點?
優(yōu)點:
職責清晰镰官、高擴展性提前、智能化。
缺點:
由于在客戶端和真實主題之間增加了代理對象泳唠,因此有些類型的代理模式可能會造成請求的處理速度變慢狈网。
實現(xiàn)代理模式需要額外的工作,有些代理模式的實現(xiàn)非常復雜笨腥。

單例模式;

1:何為單例模式拓哺?
這種模式涉及到一個單一的類,該類負責創(chuàng)建自己的對象脖母,同時確保只有單個對象被創(chuàng)建士鸥。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問谆级,不需要實例化該類的對象烤礁。
注意:
單例類只能有一個實例。
單例類必須自己創(chuàng)建自己的唯一實例肥照。
單例類必須給所有其他對象提供這一實例脚仔。
2:如何使用單例模式?
當您想控制實例數(shù)目建峭,節(jié)省系統(tǒng)資源的時候玻侥。
3:單例模式的優(yōu)缺點?
優(yōu)點:
在內(nèi)存里只有一個實例亿蒸,減少了內(nèi)存的開銷凑兰,尤其是頻繁的創(chuàng)建和銷毀實例(比如管理學院首頁頁面緩存)。
避免對資源的多重占用比如寫文件操作边锁。
缺點:
沒有接口姑食,不能繼承,與單一職責原則沖突茅坛,一個類應該只關心內(nèi)部邏輯音半,而不關心外面怎么樣來實例化。

備忘錄模式;

1:何為備忘錄模式贡蓖?
備忘錄模式(Memento Pattern)保存一個對象的某個狀態(tài)曹鸠,以便在適當?shù)臅r候恢復對象。備忘錄模式屬于行為型模式斥铺。
2:如何使用備忘錄模式彻桃?
很多時候我們總是需要記錄一個對象的內(nèi)部狀態(tài),這樣做的目的就是為了允許用戶取消不確定或者錯誤的操作晾蜘,能夠恢復到他原先的狀態(tài)邻眷,使得他有"后悔藥"可吃眠屎。
3:備忘錄模式的優(yōu)缺點?
優(yōu)點:
給用戶提供了一種可以恢復狀態(tài)的機制肆饶,可以使用戶能夠比較方便地回到某個歷史的狀態(tài)改衩。
實現(xiàn)了信息的封裝,使得用戶不需要關心狀態(tài)的保存細節(jié)驯镊。
缺點:
消耗資源葫督。如果類的成員變量過多,勢必會占用比較大的資源阿宅,而且每一次保存都會消耗一定的內(nèi)存候衍。

生成器模式;

1:何為送生成器模式洒放?
建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個復雜的對象蛉鹿。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式往湿。
2:如何使用生成器模式妖异?
主要解決在軟件系統(tǒng)中,有時候面臨著"一個復雜對象"的創(chuàng)建工作领追,其通常由各個部分的子對象用一定的算法構成他膳;由于需求的變化,這個復雜對象的各個部分經(jīng)常面臨著劇烈的變化绒窑,但是將它們組合在一起的算法卻相對穩(wěn)定棕孙。
一些基本部件不會變,而其組合經(jīng)常變化的時候些膨。
3:生成器模式的優(yōu)缺點蟀俊?
優(yōu)點:
建造者獨立,易擴展订雾。
便于控制細節(jié)風險肢预。
缺點:
產(chǎn)品必須有共同點,范圍有限制洼哎。
如內(nèi)部變化復雜烫映,會有很多的建造類。

命令模式;

1:何為命令模式噩峦?
命令模式(Command Pattern)是一種數(shù)據(jù)驅(qū)動的設計模式锭沟,它屬于行為型模式。請求以命令的形式包裹在對象中识补,并傳給調(diào)用對象族淮。調(diào)用對象尋找可以處理該命令的合適的對象,并把該命令傳給相應的對象,該對象執(zhí)行命令瞧筛。
主要解決的問題?
在軟件系統(tǒng)中导盅,行為請求者與行為實現(xiàn)者通常是一種緊耦合的關系较幌,但某些場合,比如需要對行為進行記錄白翻、撤銷或重做乍炉、事務等處理時,這種無法抵御變化的緊耦合的設計就不太合適滤馍。
2:如何使用命令模式岛琼?
在某些場合,比如要對行為進行"記錄巢株、撤銷/重做槐瑞、事務"等處理,這種無法抵御變化的緊耦合是不合適的阁苞。在這種情況下困檩,如何將"行為請求者"與"行為實現(xiàn)者"解耦?將一組行為抽象為對象那槽,可以實現(xiàn)二者之間的松耦合悼沿。
3:命令模式的優(yōu)缺點?
優(yōu)點:降低了系統(tǒng)耦合度骚灸,新的命令可以很容易添加到系統(tǒng)中去糟趾。
缺點:使用命令模式可能會導致某些系統(tǒng)有過多的具體命令類。

8.多線程有哪些甚牲?如何保證多線程中讀寫分離义郑,加鎖方案?

NSThread GCD NSOperation

iOS 實現(xiàn)線程加鎖有很多種方式鳖藕。@synchronized魔慷、 NSLock、NSRecursiveLock著恩、NSCondition院尔、NSConditionLock、pthread_mutex喉誊、dispatch_semaphore邀摆、OSSpinLock、atomic(property) set/ge等等各種方式伍茄。

9.如何刪除單鏈表中一個元素栋盹?

先來看看刪除的原理:因為數(shù)據(jù)結(jié)構是單鏈表,要想刪除第i個節(jié)點敷矫,就要找到第i個節(jié)點例获;要想找到第i個節(jié)點汉额,就要找到第i-1個節(jié)點;要想找到第i-1個節(jié)點榨汤,就要找到第i-2個節(jié)點…于是就要從第一個節(jié)點開始找起蠕搜,一直找到第i-1個節(jié)點。如何找收壕?讓一個指針從頭結(jié)點開始移動妓灌,一直移動到第i-1個節(jié)點為止。這個過程中可以用一個變量j從0開始計數(shù)蜜宪,一直自增到i-1虫埂。之后呢?我們把第i-1個節(jié)點找到了圃验,就讓它的指針域指向第i+1個節(jié)點掉伏,這樣就達到了刪除的目的。而第i+1個節(jié)點的地址又從第i個節(jié)點獲得澳窑,第i個節(jié)點的地址又是第i-1個節(jié)點的后繼岖免。因此我們可以這樣做:先讓一個指針指向第i-1個節(jié)點的后繼,(保存i+1節(jié)點的地址)照捡,再讓i-1節(jié)點的后繼指向第i個節(jié)點的后繼颅湘,這樣就將第i個節(jié)點刪除了。(p->next=q->next;)

1Status ListDelete(LinkList *L,int i,ElemType *e){
2    int j;
3    LinkList p,q;
4    p = *L; // 聲明一結(jié)點p指向鏈表第一個結(jié)點
5    j = 1;
6    while (p->next && j < i)  /* 遍歷尋找第i個元素 */
7    {
8        p = p->next;
9        ++j;
10    }
11    if (!(p->next) || j > i)
12        return ERROR;           /* 第i個元素不存在 */
13    q = p->next;
14    p->next = q->next;            /* 將q的后繼賦值給p的后繼 */
15    *e = q->data;               /* 將q結(jié)點中的數(shù)據(jù)給e */
16    free(q);                    /* 讓系統(tǒng)回收此結(jié)點栗精,釋放內(nèi)存 */
17    return OK;
18 }
19

10.NSNotificationCenter通知中心的實現(xiàn)原理闯参?

NSNotificationCenter是類似一個廣播中心站,使用defaultCenter來獲取應用中的通知中心悲立,它可以向應用任何地方發(fā)送和接收通知鹿寨。在通知中心注冊觀察者,發(fā)送者使用通知中心廣播時薪夕,以NSNotification的name和object來確定需要發(fā)送給哪個觀察者脚草。為保證觀察者能接收到通知,所以應先向通知中心注冊觀察者原献,接著再發(fā)送通知這樣才能在通知中心調(diào)度表中查找到相應觀察者進行通知馏慨。

1-(void)postNotification:(NSNotification *)notification;
2-(void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject;
3-(void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;

發(fā)送通知通過name和object來確定來標識觀察者,name和object兩個參數(shù)的規(guī)則相同即當通知設置name為kChangeNotifition時,那么只會發(fā)送給符合name為kChangeNotifition的觀察者姑隅,同理object指發(fā)送給某個特定對象通知写隶,如果只設置了name,那么只有對應名稱的通知會觸發(fā)讲仰。如果同時設置name和object參數(shù)時就必須同時符合這兩個條件的觀察者才能接收到通知慕趴。

1- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;
2- (id <NSObject>)addObserverForName:(nullable NSNotificationName)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block NS_AVAILABLE(10_6, 4_0);

第一種方式是比較常用的添加Oberver的方式,接到通知時執(zhí)行aSelector。
第二種方式是基于Block來添加觀察者冕房,往通知中心的調(diào)度表中添加觀察者躏啰,這個觀察者包括一個queue和一個block,并且會返回這個觀察者對象。當接到通知時執(zhí)行block所在的線程為添加觀察者時傳入的queue參數(shù)耙册,queue也可以為nil丙唧,那么block就在通知所在的線程同步執(zhí)行。
這里需要注意的是如果使用第二種的方式創(chuàng)建觀察者需要弱引用可能引起循環(huán)引用的對象,避免內(nèi)存泄漏觅玻。

NSNotificatinonCenter實現(xiàn)原理:
NSNotificatinonCenter是使用觀察者模式來實現(xiàn)的用于跨層傳遞消息,用來降低耦合度培漏。
NSNotificatinonCenter用來管理通知溪厘,將觀察者注冊到NSNotificatinonCenter的通知調(diào)度表中,然后發(fā)送通知時利用標識符name和object識別出調(diào)度表中的觀察者牌柄,然后調(diào)用相應的觀察者的方法畸悬,即傳遞消息(在Objective-C中對象調(diào)用方法,就是傳遞消息珊佣,消息有name或者selector蹋宦,可以接受參數(shù),而且可能有返回值)咒锻,如果是基于block創(chuàng)建的通知就調(diào)用NSNotification的block冷冗。

11.推送如何實現(xiàn)的?

1.由App向iOS設備發(fā)送一個注冊通知惑艇,用戶需要同意系統(tǒng)發(fā)送推送蒿辙。
2.iOS應用向APNS遠程推送服務器發(fā)送App的Bundle Id和設備的UDID。
3.APNS根據(jù)設備的UDID和App的Bundle Id生成deviceToken再發(fā)回給App滨巴。
4.App再將deviceToken發(fā)送給遠程推送服務器(自己的服務器), 由服務器保存在數(shù)據(jù)庫中思灌。
5.當自己的服務器想發(fā)送推送時, 在遠程推送服務器中輸入要發(fā)送的消息并選擇發(fā)給哪些用戶的deviceToken,由遠程推送服務器發(fā)送給APNS恭取。
6.APNS根據(jù)deviceToken發(fā)送給對應的用戶泰偿。

12.SEL的使用和原理?

SEL 類成員方法的指針
可以理解 @selector()就是取類方法的編號,他的行為基本可以等同C語言的中函數(shù)指針,只不過C語言中蜈垮,可以把函數(shù)名直接賦給一個函數(shù)指針耗跛,而Object-C的類不能直接應用函數(shù)指針,這樣只能做一個@selector語法來取.
它的結(jié)果是一個SEL類型攒发。這個類型本質(zhì)是類方法的編號(函數(shù)地址)

13.點擊事件如何穿透透明的View?

1- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
2    UIView *hitView = [super hitTest:point withEvent:event];
3    if(hitView == self){
4        return nil;
5    }
6    return hitView;
7 }

14.RunLoop的實現(xiàn)原理课兄?(答案待完善)

RunLoop實際上是一個對象,這個對象在循環(huán)中用來處理程序運行過程中出現(xiàn)的各種事件(比如說觸摸事件晨继、UI刷新事件烟阐、定時器事件、Selector事件)和消息,從而保持程序的持續(xù)運行蜒茄,而且在沒有事件處理的時候唉擂,會進入睡眠模式,從而節(jié)省CPU資源,提高程序性能檀葛。

15.簡述Runtime玩祟,發(fā)送消息的過程;

動態(tài)的添加對象的成員變量和方法;動態(tài)交換兩個方法的實現(xiàn);攔截并替換方法;在方法上增加額外功能;實現(xiàn)NSCoding的自動歸檔和解檔;實現(xiàn)字典轉(zhuǎn)模型的自動轉(zhuǎn)換;

clang -rewrite-objc main.m 查看最終生成代碼

消息轉(zhuǎn)發(fā):

1:動態(tài)方法解析
1+ (BOOL)resolveInstanceMethod:(SEL)selector;
2+ (BOOL)resolveClassMethod:(SEL)selector;

2:備援接收者(重定向)
1- (id)forwardingTargetForSelector:(SEL)selector;
2

3:完整的消息轉(zhuǎn)發(fā)(NSInvocation)
1- (void)forwardInvocation:(NSInvocation *)invocation;
2

16.簡述weak的實現(xiàn)原理屿聋;

weak 關鍵字的作用弱引用空扎,所引用對象的計數(shù)器不會加一,并在引用對象被釋放的時候自動被設置為 nil;
weak是有Runtime維護的weak表;
3.weak釋放為nil過程
weak被釋放為nil润讥,需要對對象整個釋放過程了解转锈,如下是對象釋放的整體流程:
1、調(diào)用objc_release
2楚殿、因為對象的引用計數(shù)為0撮慨,所以執(zhí)行dealloc
3、在dealloc中脆粥,調(diào)用了_objc_rootDealloc函數(shù)
4砌溺、在_objc_rootDealloc中,調(diào)用了object_dispose函數(shù)
5变隔、調(diào)用objc_destructInstance
6规伐、最后調(diào)用objc_clear_deallocating。
對象準備釋放時匣缘,調(diào)用clearDeallocating函數(shù)楷力。clearDeallocating函數(shù)首先根據(jù)對象地址獲取所有weak指針地址的數(shù)組,然后遍歷這個數(shù)組把其中的數(shù)據(jù)設為nil孵户,最后把這個entry從weak表中刪除萧朝,最后清理對象的記錄。
其實Weak表是一個hash(哈希)表夏哭,然后里面的key是指向?qū)ο蟮牡刂芳旒恚琕alue是Weak指針的地址的數(shù)組
總結(jié)
weak是Runtime維護了一個hash(哈希)表,用于存儲指向某個對象的所有weak指針竖配。weak表其實是一個hash(哈希)表何址,Key是所指對象的地址,Value是weak指針的地址(這個地址的值是所指對象指針的地址)數(shù)組进胯。

17.寫一個單例用爪;

1+ (instancetype)sharedInstance {
2    static RMF *instance = nil;
3    static dispatch_once_t onceToken;
4    dispatch_once(&onceToken, ^{
5        instance = [[self alloc] init];
6    });
7    
8    return instance;
9 }

18.如何從字符串中得到一個整數(shù)?

1- (BOOL)isPureNumandCharacters:(NSString *)text 
2{ 
3    for(int i = 0; i < [text length]; ++i) {
4        int a = [text characterAtIndex:i]; 
5        if ([self isNum:a]){
6            continue; 
7        } else { 
8            return NO; 
9        } 
10    } 
11    return YES; 
12}

19.數(shù)組去重方式胁镐;

數(shù)組法
1for (NSString *item in originalArr) {
2   if (![resultArrM containsObject:item]) {
3     [resultArrM addObject:item];
4   }
5}

利用NSDictionary
1for (NSNumber *n in originalArr) {
2   [dict setObject:n forKey:n];
3}

NSSet
1 NSSet *set = [NSSet setWithArray:originalArr];

20.設計一個數(shù)據(jù)庫偎血;(答案待完善)

主要是對比一下常用的幾種

21.實現(xiàn)多個網(wǎng)絡請求ABC執(zhí)行完再執(zhí)行D

方案1:使用group和semaphore
方案2:group_enter和group_leave也可以實現(xiàn)
下面使用方案1實現(xiàn)例子

1   dispatch_group_t group = dispatch_group_create();
2    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
3    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
4    dispatch_group_async(group, queue, ^{
5        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
6            //異步執(zhí)行A
7            dispatch_semaphore_signal(semaphore);
8        });
9        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
10    });
11    
12    dispatch_group_async(group, queue, ^{
13                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
14             //異步執(zhí)行B
15            dispatch_semaphore_signal(semaphore);
16        });
17        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
18    });
19    
20    dispatch_group_async(group, queue, ^{
21        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
22             //異步執(zhí)行C
23            dispatch_semaphore_signal(semaphore);
24        });
25        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
26    });
27    
28    dispatch_group_notify(group, queue, ^{
29           //執(zhí)行D
30    });

22.列表頁性能優(yōu)化

如何檢測

1)Instruments中:Core Animation诸衔;
2)FPS:CADisplayLink

優(yōu)化方案

1、文本颇玷、布局計算笨农,提前計算緩存;
2帖渠、對象創(chuàng)建谒亦;CALayer代替UIView;
3、離屏渲染空郊;
4份招、圖片解碼;

(離屏渲染是指圖層在被顯示之前是在當前屏幕緩沖區(qū)以外開辟的一個緩沖區(qū)進行渲染操作狞甚。
離屏渲染需要多次切換上下文環(huán)境:先是從當前屏幕(On-Screen)切換到離屏(Off-Screen)锁摔;等到離屏渲染結(jié)束以后,將離屏緩沖區(qū)的渲染結(jié)果顯示到屏幕上又需要將上下文環(huán)境從離屏切換到當前屏幕入愧,而上下文環(huán)境的切換是一項高開銷的動作。)
1.陰影(UIView.layer.shadowOffset/shadowRadius/…)
2.圓角(當 UIView.layer.cornerRadius 和 UIView.layer.maskToBounds 一起使用時)
3.圖層蒙板
4.開啟光柵化(shouldRasterize = true)

1嗤谚、使用CAShapeLayer和UIBezierPath設置圓角;
2棺蛛、UIBezierPath和Core Graphics框架畫出一個圓角;

1//1、使用CAShapeLayer和UIBezierPath設置圓角;
2UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:imageView.bounds.size];
3CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];
4maskLayer.frame = imageView.bounds;
5maskLayer.path = maskPath.CGPath;
6imageView.layer.mask = maskLayer;
7
8//2巩步、UIBezierPath和Core Graphics框架畫出一個圓角
9UIGraphicsBeginImageContextWithOptions(imageView.bounds.size,NO,1.0);
10[[UIBezierPathbezierPathWithRoundedRect:imageView.boundscornerRadius:imageView.frame.size.width]addClip];
11[imageView drawRect:imageView.bounds];
12imageView.image=UIGraphicsGetImageFromCurrentImageContext();
13UIGraphicsEndImageContext();
14[self.view addSubview:imageView];

23.HTTPS(答案待完善)

HTTP+對稱加密和非對稱加密+證書認證

23.音視頻相關

采集視頻,音頻–》使用iOS原生框架 AVFoundation.framework
視頻濾鏡處理–》使用iOS原生框架 CoreImage.framework旁赊;使用第三方框架 GPUImage.framework

CoreImage 與 GPUImage 框架比較:
在實際項目開發(fā)中,開發(fā)者更加傾向使用于GPUImage框架.
首先它在使用性能上與iOS提供的原生框架,并沒有差別;其次它的使用便利性高于iOS原生框架,最后也是最重要的GPUImage框架是開源的.而大家如果想要學習GPUImage框架,建議學習OpenGL ES,其實GPUImage的封裝和思維都是基于OpenGL ES.

視頻\音頻編碼壓縮
視頻: 使用FFmpeg,X264算法把視頻原數(shù)據(jù)YUV/RGB編碼成H264
音頻: 使用fdk_aac 將音頻數(shù)據(jù)PCM轉(zhuǎn)換成AAC
視頻: VideoToolBox框架
音頻: AudioToolBox 框架
硬編碼
軟編碼
推流
流媒體協(xié)議: RTMP\RTSP\HLS\FLV
視頻封裝格式: TS\FLV
音頻封裝格式: Mp3\AAC
推流: 將采集的音頻.視頻數(shù)據(jù)通過流媒體協(xié)議發(fā)送到流媒體服務器
推流技術
流媒體服務器
數(shù)據(jù)分發(fā)
截屏
實時轉(zhuǎn)碼
內(nèi)容檢測
拉流
拉流: 從流媒體服務器中獲取音頻\視頻數(shù)據(jù)
流媒體協(xié)議: RTMP\RTSP\HLS\FLV
音視頻解碼
視頻: 使用FFmpeg,X264算法解碼
音頻: 使用fdk_aac 解碼
視頻: VideoToolBox框架
音頻: AudioToolBox 框架
硬解碼
軟解碼
播放
ijkplayer,kxmovie 都是基于FFmpeg框架封裝的

ijkplayer 播放框架
kxmovie 播放框架

??推薦??:

大家可以加入iOS技術交流群,群號:789143298 群密碼:123 群內(nèi)提供數(shù)據(jù)結(jié)構與算法椅野、底層進階终畅、swift、逆向竟闪、底層面試題整合文檔等免費資料@敫!!炼蛤!
image

————————————————

版權聲明:本文為「波波9005」的原創(chuàng)文章
原文鏈接:https://blog.csdn.net/weixin_43547696/article/details/87283197
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妖爷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子理朋,更是在濱河造成了極大的恐慌絮识,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗽上,死亡現(xiàn)場離奇詭異次舌,居然都是意外死亡,警方通過查閱死者的電腦和手機兽愤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門彼念,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挪圾,“玉大人,你說我怎么就攤上這事国拇÷迨罚” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵酱吝,是天一觀的道長也殖。 經(jīng)常有香客問我,道長务热,這世上最難降的妖魔是什么忆嗜? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮崎岂,結(jié)果婚禮上捆毫,老公的妹妹穿的比我還像新娘。我一直安慰自己冲甘,他們只是感情好绩卤,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著江醇,像睡著了一般濒憋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陶夜,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天凛驮,我揣著相機與錄音,去河邊找鬼条辟。 笑死黔夭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的羽嫡。 我是一名探鬼主播本姥,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼杭棵!你這毒婦竟也來了扣草?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颜屠,失蹤者是張志新(化名)和其女友劉穎辰妙,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甫窟,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡密浑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粗井。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尔破。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡街图,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出懒构,到底是詐尸還是另有隱情餐济,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布胆剧,位于F島的核電站絮姆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秩霍。R本人自食惡果不足惜篙悯,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铃绒。 院中可真熱鬧鸽照,春花似錦、人聲如沸颠悬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赔癌。三九已至诞外,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間届榄,已是汗流浹背浅乔。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工倔喂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铝条,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓席噩,卻偏偏與公主長得像班缰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子悼枢,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 把網(wǎng)上的一些結(jié)合自己面試時遇到的面試題總結(jié)了一下埠忘,以后有新的還會再加進來。 1. OC 的理解與特性 OC 作為一...
    AlaricMurray閱讀 2,564評論 0 20
  • 1.設計模式是什么馒索? 你知道哪些設計模式莹妒,并簡要敘述? 設計模式是一種編碼經(jīng)驗绰上,就是用比較成熟的邏輯去處理某一種類...
    司馬DE晴空閱讀 1,295評論 0 7
  • 1.屬性readwrite旨怠,readonly,assign蜈块,retain鉴腻,copy迷扇,nonatomic 各是什么作...
    曾令偉閱讀 1,056評論 0 10
  • 打卡日期:2019年09月4日 109期親子踐行第101天 【宣言:超越昨天的自己,做好今天的我爽哎!先處理好情緒蜓席,再...
    自在飛_2b5a閱讀 50評論 0 0
  • 子曰:“聽訟,吾猶人也课锌。必也使無訟乎厨内!” 【注釋】 1)訟:案件,聽訟:審理案件 2)必:一定 【譯文】 孔子說:...
    學會學夫子國學閱讀 480評論 3 2