iOS開發(fā)筆試-100道

1、截取字符串”20 | http://www.baidu.com”中,”|”字符前面和后面的數(shù)據(jù),分別輸出它們

? ? NSString *str = @"20|http://www.baidu.com";

? ? NSArray *arr = [str componentsSeparatedByString:@"|"];

? ? NSLog(@"%@",arr[0]);

? ? NSLog(@"%@",arr[1]);

2赊时、.NSString *obj = [[NSSData alloc]init] ,obj在編譯時和運行時分別是什么類型的對象

編譯時是nsstring, 運行時是nsdata的一個實例

3、viewController的loadView,viewDidLoad,viewDidUnload分別是在什么時候調(diào)用的行拢?

loadView:view準備加載到當前屏幕時祖秒,檢查當前view不存在,調(diào)用loadView加載

viewDidLoad:loadView加載完成后舟奠,調(diào)用

viewDidUnload:view不再顯示在當前屏幕時竭缝,調(diào)用。

4沼瘫、屬性readwrite抬纸,readonly,assign耿戚,retain湿故,copy,nonatomic 各是什么作用膜蛔,在那種情況下用?

readwrite 是可讀可寫特性;需要生成getter方法和setter方法時

readonly 是只讀特性 只會生成getter方法 不會生成setter方法 ;不希望屬性在類外改變

assign 是賦值特性坛猪,setter方法將傳入?yún)?shù)賦值給實例變量;僅設(shè)置變量時;

retain 表示持有特性,setter方法將傳入?yún)?shù)先保留皂股,再賦值墅茉,傳入?yún)?shù)的retaincount會+1;

copy 表示賦值特性,setter方法將傳入對象復(fù)制一份;需要完全一份新的變量時呜呐。

nonatomic 非原子操作就斤,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全卵史,一般使用nonatomic

5战转、類別的作用?繼承和類別在實現(xiàn)中有何區(qū)別?

category 可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法以躯,只能添加槐秧,不能刪除修改,并且如果類別和原來類中的方法產(chǎn)生名稱沖突忧设,則類別將覆蓋原來的方法刁标,因為類別具有更高的優(yōu)先級。

類別主要有3個作用:

1).將類的實現(xiàn)分散到多個不同文件或多個不同框架中址晕。

2).創(chuàng)建對私有方法的前向引用膀懈。

3).向?qū)ο筇砑臃钦絽f(xié)議。

繼承可以增加谨垃,修改或者刪除方法启搂,并且可以增加屬性硼控。

6、類別和類擴展的區(qū)別胳赌。

category和extensions的不同在于 后者可以添加屬性牢撼。另外后者添加的方法是必須要實現(xiàn)的。

extensions可以認為是一個私有的Category疑苫。

7熏版、frame和bounds有什么不同?

frame指的是:該view在父view坐標系統(tǒng)中的位置和大小呀枢。(參照點是父親的坐標系統(tǒng))

bounds指的是:該view在本身坐標系統(tǒng)中 的位置和大小柠横。(參照點是本身坐標系統(tǒng))

8、import 跟#include 又什么區(qū)別腮考,@class呢, #import<> 跟 #import””又什么區(qū)別挺勿?

import是Objective-C導(dǎo)入頭文件的關(guān)鍵字曲横,#include是C/C++導(dǎo)入頭文件的關(guān)鍵字,使用#import頭文件會自動只導(dǎo)入一次,不會重復(fù)導(dǎo)入满钟,相當于#include和#pragma once胜榔;

@class告訴編譯器某個類的聲明胳喷,當執(zhí)行時湃番,才去查看類的實現(xiàn)文件,可以解決頭文件的相互包含吭露;#import<>用來包含系統(tǒng)的頭文件吠撮,#import””用來包含用戶頭文件。

9讲竿、以下代碼運行結(jié)果如何泥兰?

- (void)viewDidLoad{

[super viewDidLoad];

NSLog(@"1");

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"2");

});

NSLog(@"3");

}

只輸出:1 。發(fā)生主線程鎖死题禀。

10鞋诗、關(guān)于block

void test1()

{

int a = 10;

void (^block)() = ^{

NSLog(@"a is %d", a);

};

a = 20;

block(); // 10

}

void test2()

{

__block int a = 10;

void (^block)() = ^{

NSLog(@"a is %d", a);

};

a = 20;

block(); // 20

}

void test3()

{

static int a = 10;

void (^block)() = ^{

NSLog(@"a is %d", a);

};

a = 20;

block(); // 20

}

int a = 10;

void test4()

{

void (^block)() = ^{

NSLog(@"a is %d", a);

};

a = 20;

block();//20

}

11、block和weak區(qū)別迈嘹?

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

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

block對象可以在block中被重新賦值雁刷,weak不可以。

12保礼、創(chuàng)建一個單例

+(instancetype)shareSingleton{

static Singleton *singleton = nil;

static dispatch_once_t onceToken;? //給單例加了一個線程鎖

dispatch_once(&onceToken, ^{

singleton = [[Singleton alloc] init];

});

return singleton;

13沛励、寫一個標準宏MIN责语,這個宏輸入兩個參數(shù)并返回較小的一個

#define kMIN(X,Y) ((X) > (Y)) ? (Y) :(X)

14、簡述應(yīng)用程序按Home鍵進入后臺時的生命周期目派,以及從后臺回到前臺時的生命周期

進入后臺生命周期走:

- (void)applicationWillResignActive:(UIApplication*)application;

- (void)applicationDidEnterBackground:(UIApplication*)application;

回到前臺生命周期走:

- (void)applicationWillEnterForeground:(UIApplication*)application;

- (void)applicationDidBecomActive:(UIApplication*)application;

15鹦筹、將字符串“2015-04-10”格式化日期轉(zhuǎn)為NSDate類型

NSString *timeStr = @"2015-04-10";

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

formatter.dateFormat = @"yyyy-MM-dd";

formatter.timeZone = [NSTimeZone defaultTimeZone];

NSDate *date = [formatter dateFromString:timeStr];

// 2015-04-09 16:00:00 +0000

NSLog(@"%@", date);

16、isMemberOfClass 和 isKindOfClass 聯(lián)系與區(qū)別

聯(lián)系:兩者都能檢測一個對象是否是某個類的成員

區(qū)別:

isKindOfClass:確定一個對象是否是一個類的成員,或者是派生自該類的成員.

isMemberOfClass:確定一個對象是否是當前類的成員.

舉例:如 ClassA派 生 自NSObject 類 , ClassA *a = [ClassA alloc] init];,[a isKindOfClass:[NSObject class]] 可以檢查出 a 是否是 NSObject派生類 的成員,但 isMemberOfClass 做不到址貌。

17铐拐、描述應(yīng)?用程序的啟動順序

程序入口main函數(shù)創(chuàng)建UIApplication實例和UIApplication代理實例.

重寫UIApplication代理實例,設(shè)置rootviewcontroller.

在第一viewController中添加控件,實現(xiàn)對應(yīng)的程序界面.

18、在某個方法中 self.name = _name练对,name = _name 它 們有區(qū)別嗎,為什么?

self.name = "object"會調(diào)用對象的setName()方法遍蟋,

name = "object"會直接把object賦值給當前對象的name 屬性。

并且 self.name 這樣retainCount會加1,而name就不會螟凭。

19虚青、解釋self = [super init]方法

容錯處理,當父類初始化失敗螺男,會返回一個nil棒厘,表示初始化失敗,由于繼承的關(guān)系下隧,子類是要得到父類的實例和行為奢人,因此我們必須先初始化父類,然后初始化子類

20淆院、我們說的oc是動態(tài)運行時語言是什么意思?

答案:多態(tài)何乎。 主要是將數(shù)據(jù)類型的確定由編譯時,推遲到了運行時土辩。

這個問題其實淺涉及到兩個概念支救,運行時和多態(tài)。

簡單來說拷淘,運行時機制使我們直到運行時才去決定一個對象的類別各墨,以及調(diào)用該類別對象指定方法。

多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)启涯。意思就是假設(shè)生物類(life)都用有一個相同的方法-eat;

那人類屬于生物贬堵,豬也屬于生物,都繼承了life后逝嚎,實現(xiàn)各自的eat扁瓢,但是調(diào)用是我們只需調(diào)用各自的eat方法。

也就是不同的對象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個選擇器)补君。

21引几、自動釋放池是什么,如何工作

當您向一個對象發(fā)送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放.它仍然是個正當?shù)膶ο螅虼俗詣俞尫懦囟x的作用域內(nèi)的其它對象可以向它發(fā)送消息伟桅。當程序執(zhí)行到作用域結(jié)束的位置時敞掘,自動釋放池就會被釋放,池中的所有對象也就被釋放楣铁。

22玖雁、簡述內(nèi)存分區(qū)情況

1).代碼區(qū):存放函數(shù)二進制代碼

2).數(shù)據(jù)區(qū):系統(tǒng)運行時申請內(nèi)存并初始化,系統(tǒng)退出時由系統(tǒng)釋放盖腕。存放全局變量赫冬、靜態(tài)變量、常量

3).堆區(qū):通過malloc等函數(shù)或new等操作符動態(tài)申請得到溃列,需程序員手動申請和釋放

4).棧區(qū):函數(shù)模塊內(nèi)申請劲厌,函數(shù)結(jié)束時由系統(tǒng)自動釋放。存放局部變量听隐、函數(shù)參數(shù)

23补鼻、隊列和棧有什么區(qū)別

隊列和棧是兩種不同的數(shù)據(jù)容器。從”數(shù)據(jù)結(jié)構(gòu)”的角度看雅任,它們都是線性結(jié)構(gòu)风范,即數(shù)據(jù)元素之間的關(guān)系相同。

隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu)沪么,它在兩端進行操作硼婿,一端進行入隊列操作,一端進行出列隊操作成玫。

棧是一種先進后出的數(shù)據(jù)結(jié)構(gòu)加酵,它只能在棧頂進行操作拳喻,入棧和出棧都在棧頂操作哭当。

24、Quatrz 2D的繪圖功能的三個核心概念是什么并簡述其作用冗澈。

答:上下文:主要用于描述圖形寫入哪里钦勘;

路徑:是在圖層上繪制的內(nèi)容;

狀態(tài):用于保存配置變換的值亚亲、填充和輪廓彻采, alpha 值等。

25捌归、什么是沙盒模型肛响?哪些操作是屬于私有api范疇?

某個iphone工程進行文件操作有此工程對應(yīng)的指定的位置,不能逾越惜索。

iphone沙箱模型的有四個文件夾documents特笋,tmp,app巾兆,Library猎物,永久數(shù)據(jù)存儲一般

放documents文件夾虎囚,得到模擬器的路徑的可使用NSHomeDirectory()方法。

Nsuserdefaults保存的文件在Library/Preference:?

26蔫磨、重寫一個NSString類型的淘讥,retain方式聲明name屬性的setter和getter方法

-(void)settetName:(NSString *)name{

if(_name){

[_name release];

}

_name = [name retain];

}

-(NSString *)getterName{

return [[_name retain]autorelease];

27、如監(jiān)測系統(tǒng)鍵盤的彈出

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShown:) name:UIKeyboardWillShowNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

/** 鍵盤彈出動畫 */

-(void)onKeyboradShow:(NSNotification *)notify

{

CGFloat keyboard = [[notify.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue].size.height;

CGFloat duration = [[notify.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]floatValue];

[UIView animateWithDuration:duration + 0.25 delay:0 usingSpringWithDamping:1 initialSpringVelocity:1 options:UIViewAnimationOptionLayoutSubviews animations:^{

self.inputView.frame = CGRectMake(0, k_screenHeight - keyboard - 50, k_screenWidth, 50);

} completion:nil];

self.isOriginal = NO;

self.maskView.hidden = NO;

}

/** 鍵盤收起動畫 */

-(void) onKeyboradHide:(NSNotification *) notify

{

CGFloat duration = [[notify.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]floatValue];

[UIView animateWithDuration:duration delay:0 usingSpringWithDamping:1 initialSpringVelocity:1 options:UIViewAnimationOptionLayoutSubviews animations:^{

self.inputView.frame = CGRectMake(0, k_screenHeight - 50, k_screenWidth, 50);

} completion:nil];

self.isOriginal = NO;

self.maskView.hidden = YES;

}

28堤如、用OC寫一個冒泡排序

NSMutableArray *array = [NSMutableArray arrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];

for (int i =0; i < array.count;i ++) {

? ? for (int j =0; j < array.count -1 - i; j++) {

? ? ? ? if([[array objectAtIndex:j]integerValue] > [[array objectAtIndex:j + 1]integerValue]) {

? ? ? ? [array exchangeObjectAtIndex:j withObjectAtIndex:j + 1];

? ? ? ? }

? ? }

}

NSLog(@"%@",array);

29蒲列、回答person的retainCount值,并解釋為什么

Person * per = [[Person alloc] init]; 此時person 的retainCount的值是1

self.person = per;

在self.person 時,如果是assign,person的 retainCount的值不變,仍為1

若是:retain person的retainCount的值加1,變?yōu)?

若是:copy person的retainCount值不變,仍為1

30、實用sql語句查詢出省名以“湖”開頭搀罢,右邊為“436001”所在的市區(qū)

SELECT *FROM CITYS WHERE PROVINCE_NAME LIKE ‘湖%’ AND POST_CODE = 436001;

31嫉嘀、打印結(jié)果為多少

int a[5] = {1,2,3,4,5};?

int *ptr = (int *)(&a+1);

NSLog(@"%d,%d",*(a + 1),*(ptr - 1));

打印結(jié)果為: 2,5

1.*(a+1)=a[0+1]=a[1]=2

2.&a表示對數(shù)組取地址魄揉,&a+1表示a[5]后面一個地址剪侮,(ptr-1)表示對當前數(shù)組元素地址向前移動一位,并取值洛退,故等于a[4]=5

32瓣俯、用預(yù)處理指令#define聲明一個常數(shù),用以表明1年中有多少秒(忽略閏年問題)

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

33兵怯、簡述內(nèi)存分區(qū)情況

1)代碼區(qū):存放函數(shù)二進制代碼

2)數(shù)據(jù)區(qū):系統(tǒng)運行時申請內(nèi)存并初始化彩匕,系統(tǒng)退出時由系統(tǒng)釋放。存放全局變量媒区、靜態(tài)變量驼仪、常量

3)堆區(qū):通過malloc等函數(shù)或new等操作符動態(tài)申請得到,需程序員手動申請和釋放

4)棧區(qū):函數(shù)模塊內(nèi)申請袜漩,函數(shù)結(jié)束時由系統(tǒng)自動釋放绪爸。存放局部變量、函數(shù)參數(shù)

34宙攻、const char *p;? charconst*p;? char*const p;? const char* const p;四個修飾指針有什么區(qū)別

1)定義了一個指向不可變的字符串的字符指針

2)和(1)一樣

3)定義了一個指向字符串的指針奠货,該指針值不可改變,即不可改變指向

4)定義了一個指向不可變的字符串的字符指針座掘,且該指針也不可改變指向

35递惋、OC中加號方法與減號的區(qū)別?

加號方法是類方法溢陪,屬于靜態(tài)方法

減號方法是實例方法必須由類的實例來調(diào)用

36萍虽、ViewController 的 loadView, viewDidLoad,viewDidUnload 分別是在什么時候調(diào)用的?在自定義ViewController的時候這幾個函數(shù)里面應(yīng)該做什么工作形真?

viewDidLoad在view 從nib文件初始化時調(diào)用杉编,loadView在controller的view為nil時調(diào)用。此方法在編程實現(xiàn)view時調(diào)用,view 控制器默認會注冊memory warning notification,當view controller的任何view 沒有用的時候,viewDidUnload會被調(diào)用王财,在這里實現(xiàn)將retain 的view release,如果是retain的IBOutlet view 屬性則不要在這里release,IBOutlet會負責(zé)release 卵迂。

37、有哪幾種手勢通知方法绒净、寫清楚方法名

-(void)touchesBegan:(NSSet*)touchedwithEvent:(UIEvent*)event;

-(void)touchesMoved:(NSSet*)touched withEvent:(UIEvent*)event;

-(void)touchesEnded:(NSSet*)touchedwithEvent:(UIEvent*)event;

-(void)touchesCanceled:(NSSet*)touchedwithEvent:(UIEvent*)event;

38见咒、id 聲明的對象有什么特性?

id 是個很重要的類型挂疆,是個可以指向任何類型的指針或者可以理解為指向任何未知類型的指針改览。

39、獲取項目根路徑缤言,并在其下創(chuàng)建一個名稱為userData 的目錄

// 獲取根路徑

NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

NSString *documentsDirectory = [paths objectAtIndex:];

// 創(chuàng)建文件系統(tǒng)管理器

NSFileManager *fileManager = [[NSFileManageralloc] init];

// 判斷userData 目錄是否存在

if(![fileManagerfileExistsAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]]) {

// 不存在, 創(chuàng)建一個userData目錄

[fileManagercreateDirectoryAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]withIntermediateDirectories:falseattributes:nilerror:nil];

}

40宝当、tableView 的重用機制

UITableView 通過重用單元格來達到節(jié)省內(nèi)存的目的: 通過為每個單元格指定一個重用標識符(reuseIdentifier),即指定了單元格的種類,以及當單元格滾出屏幕時,允許恢復(fù)單元格以便重用.對于不同種類的單元格使用不同的ID,對于簡單的表格,一個標識符就夠了.

41、用變量a 給出下面的定義

a)? ? 一個整型

b)? ? 一個指向整型數(shù)的指針

c)? ? 一個指向指針的的指針胆萧,它指向的指針是指向一個整型數(shù)

d)? ? 一個有10 個整型數(shù)的數(shù)組

e)? ? 一個有10 個指針的數(shù)組庆揩,該指針是指向一個整型數(shù)的

f)? ? 一個指向有10 個整型數(shù)數(shù)組的指針

g)? ? 一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)

h)? ? 一個有10 個指針的數(shù)組跌穗,該指針指向一個函數(shù)订晌,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)

a)? ? int a;

b)? ? int *a;

c)? ? int **a;

d)? ? int a[10]

e)? ? int *a[10];

f)? ? int (*a)[10];

g)? ? int (*a)(int);

i)? ? int (*a[10])(int);

42、用NSLog 函數(shù)輸出一個浮點類型蚌吸,結(jié)果四舍五入锈拨,并保留一位小數(shù)

NSLog(@”%0.1f”,4.4324);

43、switch 語句 if 語句區(qū)別與聯(lián)系

均表示條件的判斷,switch語句表達式只能處理的是整型羹唠、字符型和枚舉類型,而選擇流程語句則沒有這樣的限制奕枢。但switch語句比選擇流程控制語句效率更高。

44佩微、對象可以被copy的條件

只有實現(xiàn)了NSCopying和NSMutableCopying協(xié)議的類的對象才能被拷貝,分為不可變拷貝和可變拷貝,

NSCopying協(xié)議方法為:

- (id)copyWithZone:(NSZone *)zone

{

Person *person = [[[Person class] allocWithZone:zone] init];

person.age = self.age;

person.name = self.name;

return person;

}

45缝彬、UITableViewCell上有個UILabel,顯示NSTimer實現(xiàn)的秒表時間喊衫,手指滾動cell過程中跌造,label是否刷新,為什么族购?

這是否刷新取決于timer加入到Run Loop中的Mode是什么。Mode主要是用來指定事件在運行循環(huán)中的優(yōu)先級的陵珍,分為:

NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默認寝杖,空閑狀態(tài)

UITrackingRunLoopMode:ScrollView滑動時會切換到該Mode

UIInitializationRunLoopMode:run loop啟動時,會切換到該mode

NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集合

蘋果公開提供的Mode有兩個:

NSDefaultRunLoopMode(kCFRunLoopDefaultMode)

NSRunLoopCommonModes(kCFRunLoopCommonModes)

在編程中:如果我們把一個NSTimer對象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主運行循環(huán)中的時候, ScrollView滾動過程中會因為mode的切換互纯,而導(dǎo)致NSTimer將不再被調(diào)度瑟幕。當我們滾動的時候,也希望不調(diào)度,那就應(yīng)該使用默認模式只盹。但是宰啦,如果希望在滾動時咏尝,定時器也要回調(diào),那就應(yīng)該使用common mode。

46瞬矩、有a、b政模、c笋熬、d 4個異步請求,如何判斷a菩鲜、b园细、c、d都完成執(zhí)行接校?如果需要a猛频、b、c蛛勉、d順序執(zhí)行伦乔,該如何實現(xiàn)?

對于這四個異步請求董习,要判斷都執(zhí)行完成最簡單的方式就是通過GCD的group來實現(xiàn):

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, queue, ^{ /*任務(wù)a */ });

dispatch_group_async(group, queue, ^{ /*任務(wù)b */ });

dispatch_group_async(group, queue, ^{ /*任務(wù)c */ });

dispatch_group_async(group, queue, ^{ /*任務(wù)d */ });

dispatch_group_notify(group,dispatch_get_main_queue(), ^{ // 在a烈和、b、c皿淋、d異步執(zhí)行完成后招刹,會回調(diào)這里});

當然,我們還可以使用非常老套的方法來處理窝趣,通過四個變量來標識a疯暑、b、c哑舒、d四個任務(wù)是否完成妇拯,然后在runloop中讓其等待,當完成時才退出runloop洗鸵。但是這樣做會讓后面的代碼得不到執(zhí)行越锈,直到Run loop執(zhí)行完畢。

解釋:要求順序執(zhí)行膘滨,那么可以將任務(wù)放到串行隊列中甘凭,自然就是按順序來異步執(zhí)行了。

47火邓、使用block有什么好處丹弱?使用NSTimer寫出一個使用block顯示(在UILabel上)秒表的代碼

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0

repeats:YES

callback:^() {

weakSelf.secondsLabel.text = ...

}

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

48德撬、一個view已經(jīng)初始化完畢,view上面添加了n個button躲胳,除用view的tag之外蜓洪,還可以采用什么辦法來找到自己想要的button來修改button的值

第一種:如果是點擊某個按鈕后,才會刷新它的值坯苹,其它不用修改隆檀,那么不用引用任何按鈕,直接在回調(diào)時北滥,就已經(jīng)將接收響應(yīng)的按鈕給傳過來了刚操,直接通過它修改即可。

第二種:點擊某個按鈕后再芋,所有與之同類型的按鈕都要修改值菊霜,那么可以通過在創(chuàng)建按鈕時將按鈕存入到數(shù)組中,在需要的時候遍歷查找济赎。

49鉴逞、TCP連接的三次握手

第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進入SYN_SEND狀態(tài)司训,等待服務(wù)器確認构捡;

第二次握手:服務(wù)器收到syn包,必須確認客戶的SYN(ack=j+1)壳猜,同時自己也發(fā)送一個SYN包勾徽,即SYN+ACK包,此時服務(wù)器進入SYN+RECV狀態(tài)统扳;

第三次握手:客戶端收到服務(wù)器的SYN+ACK包喘帚,向服務(wù)器發(fā)送確認包ACK(ack=k+1),此發(fā)送完畢咒钟,客戶端和服務(wù)器進入ESTABLISHED狀態(tài)吹由,完成三次狀態(tài)。

50朱嘴、Scoket連接和HTTP連接的區(qū)別:

HTTP協(xié)議是基于TCP連接的倾鲫,是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)萍嬉。Socket是對TCP/IP協(xié)議的封裝乌昔,Socket本身并不是協(xié)議,而是一個調(diào)用接口(API)帚湘,通過Socket玫荣,我們才能使用TCP/IP協(xié)議。

HTTP連接:短連接大诸,客戶端向服務(wù)器發(fā)送一次請求捅厂,服務(wù)器響應(yīng)后連接斷開,節(jié)省資源资柔。服務(wù)器不能主動給客戶端響應(yīng)(除非采用HTTP長連接技術(shù))焙贷,iPhone主要使用類NSURLConnection。

Socket連接:長連接贿堰,客戶端跟服務(wù)器端直接使用Socket進行連接辙芍,沒有規(guī)定連接后斷開,因此客戶端和服務(wù)器段保持連接通道羹与,雙方可以主動發(fā)送數(shù)據(jù)故硅,一般多用于游戲.Socket默認連接超時時間是30秒,默認大小是8K(理解為一個數(shù)據(jù)包大凶莞椤)吃衅。

51、HTTP協(xié)議的特點腾誉,關(guān)于HTTP請求GET和POST的區(qū)別

GET和POST的區(qū)別:HTTP超文本傳輸協(xié)議徘层,是短連接,是客戶端主動發(fā)送請求利职,服務(wù)器做出響應(yīng)趣效,服務(wù)器響應(yīng)之后,鏈接斷開猪贪。HTTP是一個屬于應(yīng)用層面向?qū)ο蟮膮f(xié)議跷敬,HTTP有兩類報文:請求報文和響應(yīng)報文。HTTP請求報文:一個HTTP請求報文由請求行热押、請求頭部西傀、空行和請求數(shù)據(jù)4部分組成。HTTP響應(yīng)報文:由三部分組成:狀態(tài)行楞黄、消息報頭池凄、響應(yīng)正文。GET請求:參數(shù)在地址后拼接鬼廓,沒有請求數(shù)據(jù)肿仑,不安全(因為所有參數(shù)都拼接在地址后面),不適合傳輸大量數(shù)據(jù)(長度有限制碎税,為1024個字節(jié))尤慰。? GET提交、請求的數(shù)據(jù)會附在URL之后雷蹂,即把數(shù)據(jù)放置在HTTP協(xié)議頭中伟端。

以?分割URL和傳輸數(shù)據(jù)匪煌,多個參數(shù)用&連接责蝠。如果數(shù)據(jù)是英文字母或數(shù)字党巾,原樣發(fā)送,

如果是空格霜医,轉(zhuǎn)換為+齿拂,如果是中文/其他字符,則直接把字符串用BASE64加密肴敛。POST請求:參數(shù)在請求數(shù)據(jù)區(qū)放著署海,相對GET請求更安全,并且數(shù)據(jù)大小沒有限制医男。把提交的數(shù)據(jù)放置在HTTP包的包體中.GET提交的數(shù)據(jù)會在地址欄顯示出來砸狞,而POST提交,地址欄不會改變镀梭。傳輸數(shù)據(jù)的大械渡:GET提交時,傳輸數(shù)據(jù)就會受到URL長度限制丰辣,POST由于不是通過URL傳值撒强,理論上書不受限。安全性:POST的安全性要比GET的安全性高笙什;通過GET提交數(shù)據(jù)飘哨,用戶名和密碼將明文出現(xiàn)在URL上,比如登陸界面有可能被瀏覽器緩存琐凭。HTTPS:安全超文本傳輸協(xié)議(Secure Hypertext Transfer Protocol)芽隆,它是一個安全通信通道,基于HTTP開發(fā)统屈,用于客戶計算機和服務(wù)器之間交換信息胚吁,使用安全套結(jié)字層(SSI)進行信息交換,即HTTP的安全版愁憔。

52腕扶、網(wǎng)絡(luò)七層協(xié)議

應(yīng)用層:

1.用戶接口、應(yīng)用程序吨掌;

2.Application典型設(shè)備:網(wǎng)關(guān)半抱;

3.典型協(xié)議、標準和應(yīng)用:TELNET膜宋、FTP窿侈、HTTP

表示層:

1.數(shù)據(jù)表示、壓縮和加密presentation

2.典型設(shè)備:網(wǎng)關(guān)

3.典型協(xié)議秋茫、標準和應(yīng)用:ASCLL史简、PICT、TIFF肛著、JPEG|MPEG

4.表示層相當于一個東西的表示圆兵,表示的一些協(xié)議跺讯,比如圖片、聲音和視頻MPEG衙傀。

會話層:

1.會話的建立和結(jié)束抬吟;

2.典型設(shè)備:網(wǎng)關(guān)萨咕;

3.典型協(xié)議统抬、標準和應(yīng)用:RPC、SQL危队、NFS聪建、X WINDOWS、ASP

傳輸層:

1.主要功能:端到端控制Transport茫陆;

2.典型設(shè)備:網(wǎng)關(guān)金麸;

3.典型協(xié)議、標準和應(yīng)用:TCP簿盅、UDP挥下、SPX

網(wǎng)絡(luò)層:

1.主要功能:路由、尋址Network桨醋;

2.典型設(shè)備:路由器棚瘟;

3.典型協(xié)議、標準和應(yīng)用:IP喜最、IPX偎蘸、APPLETALK、ICMP瞬内;

數(shù)據(jù)鏈路層:

1.主要功能:保證無差錯的疏忽鏈路的data link迷雪;

2.典型設(shè)備:交換機、網(wǎng)橋虫蝶、網(wǎng)卡章咧;

3.典型協(xié)議、標準和應(yīng)用:802.2能真、802.3ATM赁严、HDLC、FRAME RELAY舟陆;

物理層:

1.主要功能:傳輸比特流Physical误澳;

2.典型設(shè)備:集線器、中繼器

3.典型協(xié)議秦躯、標準和應(yīng)用:V.35忆谓、EIA/TIA-232.

53、對NSUserDefaults的理解

NSUserDefaults:系統(tǒng)提供的一種存儲數(shù)據(jù)的方式踱承,主要用于保存少量的數(shù)據(jù)倡缠,默認存儲到library下的Preferences文件夾哨免。

54、SDWebImage原理

從內(nèi)存中(字典)找圖片(當這個圖片在本次程序加載過)昙沦,找到直接使用琢唾;

從沙盒中找,找到直接使用盾饮,緩存到內(nèi)存采桃。

從網(wǎng)絡(luò)上獲取,使用丘损,緩存到內(nèi)存普办,緩存到沙盒咐柜。

55藕畔、@synthesize、@dynamic的理解

@synthesize是系統(tǒng)自動生成getter和setter屬性聲明;@synthesize的意思是芭逝,除非開發(fā)人員已經(jīng)做了呈础,否則由編譯器生成相應(yīng)的代碼舆驶,以滿足屬性聲明;

@dynamic是開發(fā)者自已提供相應(yīng)的屬性聲明,@dynamic意思是由開發(fā)人員提供相應(yīng)的代碼:對于只讀屬性需要提供setter而钞,對于讀寫屬性需要提供 setter 和getter沙廉。查閱了一些資料確定@dynamic的意思是告訴編譯器,屬性的獲取與賦值方法由用戶自己實現(xiàn), 不自動生成。

56笨忌、UIViewController的完整生命周期

-[ViewController initWithNibName:bundle:]蓝仲;

-[ViewController init];

-[ViewController loadView]官疲;

-[ViewController viewDidLoad]袱结;

-[ViewController viewWillAppear:];

-[ViewController viewDidAppear:]途凫;

-[ViewController viewWillDisappear:]垢夹;

-[ViewController viewDidDisappear:];

57维费、#define定義的宏和const定義的常量有什么區(qū)別果元?

#define定義宏的指令,程序在預(yù)處理階段將用#define所定義的內(nèi)容只是進行了替換犀盟。因此程序運行時而晒,常量表中并沒有用#define所定義的宏,系統(tǒng)并不為它分配內(nèi)存阅畴,而且在編譯時不會檢查數(shù)據(jù)類型倡怎,出錯的概率要大一些。

const定義的常量,在程序運行時是存放在常量表中监署,系統(tǒng)會為它分配內(nèi)存颤专,而且在編譯時會進行類型檢查。

#define定義表達式時要注意“邊緣效應(yīng)”钠乏,例如如下定義:

#define N 2 + 3 // 我們預(yù)想的N值是5栖秕,我們這樣使用N

inta = N/ 2;? // 我們預(yù)想的a的值是2.5,可實際上a的值是3.5

58晓避、TCP和UDP的區(qū)別是什么

TCP:面向連接簇捍、傳輸可靠(保證數(shù)據(jù)正確性,保證數(shù)據(jù)順序傳輸)够滑、用于傳輸大量數(shù)據(jù)(流模式)垦写、速度慢,建立連接需要開銷較多(時間彰触,系統(tǒng)資源)。

UDP:面向非連接命辖、傳輸不可靠况毅、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)、速度快尔艇,傳輸?shù)氖菆笪摹?/p>

59尔许、MD5和Base64的區(qū)別是什么,各自使用場景是什么终娃?

MD5:是一種不可逆的摘要算法味廊,用于生成摘要,無法逆著破解得到原文棠耕。常用的是生成32位摘要余佛,用于驗證數(shù)據(jù)的有效性。比如窍荧,在網(wǎng)絡(luò)請求接口中辉巡,通過將所有的參數(shù)生成摘要,客戶端和服務(wù)端采用同樣的規(guī)則生成摘要蕊退,這樣可以防篡改郊楣。又如,下載文件時瓤荔,通過生成文件的摘要净蚤,用于驗證文件是否損壞。

Base64:屬于加密算法输硝,是可逆的今瀑,經(jīng)過encode后,可以decode得到原文。在開發(fā)中放椰,有的公司上傳圖片采用的是將圖片轉(zhuǎn)換成base64字符串作烟,再上傳。在做加密相關(guān)的功能時砾医,通常會將數(shù)據(jù)進行base64加密/解密拿撩。

60、發(fā)送10個網(wǎng)絡(luò)請求如蚜,然后再接收到所有回應(yīng)之后執(zhí)行后續(xù)操作压恒,如何實現(xiàn)?

從題目分析可知错邦,10個請求要全部完成后探赫,才執(zhí)行某一功能。比如撬呢,下載10圖片后合成一張大圖伦吠,就需要異步全部下載完成后,才能合并成大圖魂拦。

做法:通過dispatch_group_t來實現(xiàn)毛仪,將每個請求放入到Group中,將合并成大圖的操作放在dispatch_group_notify中實現(xiàn)芯勘。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, queue, ^{ /*加載圖片1 */ });

dispatch_group_async(group, queue, ^{ /*加載圖片2 */ });

dispatch_group_async(group, queue, ^{ /*加載圖片3 */ });

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

// 合并圖片

});

61箱靴、對象添加到通知中心中,當通知中心發(fā)通知時荷愕,這個對象卻已經(jīng)被釋放了衡怀,可能會出現(xiàn)什么問題?

其實這種只是考查對通知的簡單應(yīng)用安疗。通知是多對多的關(guān)系抛杨,主要使用場景是跨模塊傳值。當某對象加入到通知中心后茂契,若在對象被銷毀前不將該對象從通知中心中移除蝶桶,當發(fā)送通知時,就會造成崩潰掉冶。這是很常見的真竖。所以,在添加到通知中心后厌小,一定要在釋放前移除恢共。

62、這段代碼有什么問題,如何修改

for (int i = 0; i < someLargeNumber; i++) {NSString *string = @”Abc”;

string = [string lowercaseString];

string = [string stringByAppendingString:@"xyz"];NSLog(@“%@”, string);

}

會出現(xiàn)內(nèi)存泄露

修改之后:

for(int i = 0; i<1000;i++){

NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];NSString *string = @"Abc";

string = [string lowercaseString];

string = [string stringByAppendingString:@"xyz"];NSLog(@"%@",string);

//釋放池

[pool1 drain];}

63璧亚、父類實現(xiàn)深拷貝時讨韭,子類如何實現(xiàn)深度拷貝。父類沒有實現(xiàn)深拷貝時,子類如何實現(xiàn)深度拷貝透硝。

深拷貝同淺拷貝的區(qū)別:淺拷貝是指針拷貝狰闪,對一個對象進行淺拷貝,相當于對指向?qū)ο蟮闹羔樳M行復(fù)制濒生,產(chǎn)生一個新的指向這個對象的指針埋泵,那么就是有兩個指針指向同一個對象,這個對象銷毀后兩個指針都應(yīng)該置空罪治。深拷貝是對一個對象進行拷貝丽声,相當于對對象進行復(fù)制,產(chǎn)生一個新的對象觉义,那么就有兩個指針分別指向兩個對象雁社。當一個對象改變或者被銷毀后拷貝出來的新的對象不受影響。

實現(xiàn)深拷貝需要實現(xiàn)NSCoying協(xié)議晒骇,實現(xiàn)- (id)copyWithZone:(NSZone *)zone 方法霉撵。當對一個property屬性含有copy修飾符的時候,在進行賦值操作的時候?qū)嶋H上就是調(diào)用這個方法厉碟。

父類實現(xiàn)深拷貝之后喊巍,子類只要重寫copyWithZone方法,在方法內(nèi)部調(diào)用父類的copyWithZone方法箍鼓,之后實現(xiàn)自己的屬性的處理

父類沒有實現(xiàn)深拷貝,子類除了需要對自己的屬性進行處理呵曹,還要對父類的屬性進行處理款咖。

64、將一個函數(shù)在主線程執(zhí)行的4種方法

GCD方法奄喂,通過向主線程隊列發(fā)送一個block塊铐殃,使block里的方法可以在主線程中執(zhí)行。

dispatch_async(dispatch_get_main_queue(), ^{

//需要執(zhí)行的方法

});

NSOperation 方法

NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];? //主隊列

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

//需要執(zhí)行的方法

}];

[mainQueue addOperation:operation];

NSThread 方法

[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES modes:nil];

[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];

[[NSThread mainThread] performSelector:@selector(method) withObject:nil];

RunLoop方法

[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil];

65跨新、id和NSObject*的區(qū)別

id是一個 objc_object 結(jié)構(gòu)體指針富腊,定義是

typedef struct objc_object *id

id可以理解為指向?qū)ο蟮闹羔槨K衞c的對象 id都可以指向域帐,編譯器不會做類型檢查赘被,id調(diào)用任何存在的方法都不會在編譯階段報錯,當然如果這個id指向的對象沒有這個方法肖揣,該崩潰還是會崩潰的民假。

NSObject *指向的必須是NSObject的子類,調(diào)用的也只能是NSObjec里面的方法否則就要做強制類型轉(zhuǎn)換龙优。

不是所有的OC對象都是NSObject的子類羊异,還有一些繼承自NSProxy。NSObject *可指向的類型是id的子集。

66野舶、static關(guān)鍵字的作用

1易迹、節(jié)省內(nèi)存。靜態(tài)變量只存儲一處平道,但供所有對象使用睹欲。

2、它的值是可以更新的巢掺。

3句伶、可提高時間效率。只要某個對象對靜態(tài)變量更新一次陆淀,所有的對象都能訪問更新后的值考余。

67、RunLoop是什么轧苫?

一個RunLoop就是一個事件處理的循環(huán)楚堤,用來不停的調(diào)度工作以及處理輸入時間。使用runloop的目的是讓你的線程在有工作的時候忙于工作,而沒工作的時候處于休眠狀態(tài)含懊。主要是是為了減少 cpu無謂的空轉(zhuǎn)身冬。每個線程都有Runloop, 主線程的Runloop時默認開啟的, 手動開辟的子線程Runloop是默認不開啟 的, 如果需要開啟, 需要調(diào)用API[[NSRunloop? currentRunloop] run]開啟.

最常見的需要開啟Runloop的是在子線程里面調(diào)用計時器(NSTimer), 如果不開啟runloop循環(huán)方法就不能正常執(zhí)行.

68、字符串替換方法

[string stringByReplacingOccurrencesOfString:@"png" withString: @""]

69岔乔、數(shù)組和指針的區(qū)別

(1)數(shù)組可以申請在棧區(qū)和數(shù)據(jù)區(qū)酥筝;指針可以指向任意類型的內(nèi)存塊

(2)sizeof作用于數(shù)組時,得到的是數(shù)組所占的內(nèi)存大谐拧嘿歌;作用于指針時,得到的都是4個字節(jié)的大小

(3)數(shù)組名表示數(shù)組首地址茁影,值不可以改變宙帝,如不可以將++作用于數(shù)組名上;普通指針的值可以改變募闲,如可將++作用于指針上

(4)用字符串初始化字符數(shù)組是將字符串的內(nèi)容拷貝到字符數(shù)組中步脓;用字符串初始化字符指針是將字符串的首地址賦給指針,也就是指針指向了該數(shù)組

70浩螺、在Obj-c中有沒有私有方法靴患?私有變量?一般采用什么方法實現(xiàn)年扩?

objective-c – 類里面的方法只有兩種, 靜態(tài)方法和實例方法. 這似乎就不是完整的面向?qū)ο罅?按照OO的原則就是一個對象只暴露有用的東西. 如果沒有了私有方法的話, 對于一些小范圍的代碼重用就不那么順手了. 在類里面聲名一個私有方法

@interfaceController : NSObject { NSString *something; }

+(void)thisIsAStaticMethod;

-(void)thisIsAnInstanceMethod;

@end

@interfaceController (private)

-(void)thisIsAPrivateMethod;

@end

@private可以用來修飾私有變量

在Objective‐C中蚁廓,所有實例變量默認都是私有的,所有實例方法默認都是公有的

71厨幻、在終端環(huán)境下相嵌,分別說明4,2,1,0對應(yīng)的權(quán)限是什么

linux系統(tǒng)下文件的權(quán)限由三位二進制數(shù)表示腿时,從左到右依次表示讀、寫饭宾、可執(zhí)行批糟。0表示不行,1表示行看铆。4對應(yīng)2進制的100徽鼎,就是可讀不可寫不可執(zhí)行。

72弹惦、隊列和棧有什么區(qū)別

隊列和棧是兩種不同的數(shù)據(jù)容器否淤。從”數(shù)據(jù)結(jié)構(gòu)”的角度看,它們都是線性結(jié)構(gòu)棠隐,即數(shù)據(jù)元素之間的關(guān)系相同石抡。

隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu),它在兩端進行操作助泽,一端進行入隊列操作啰扛,一端進行出列隊操作。

棧是一種先進后出的數(shù)據(jù)結(jié)構(gòu)嗡贺,它只能在棧頂進行操作隐解,入棧和出棧都在棧頂操作。

73诫睬、HTTP協(xié)議中煞茫,POST和GET的區(qū)別是什么?

答案:1.GET 方法

GET 方法提交數(shù)據(jù)不安全摄凡,數(shù)據(jù)置于請求行溜嗜,客戶端地址欄可見;

GET 方法提交的數(shù)據(jù)大小有限

GET 方法不可以設(shè)置書簽

2.POST 方法

POST 方法提交數(shù)據(jù)安全,數(shù)據(jù)置于消息主體內(nèi)架谎,客戶端不可見

POST 方法提交的數(shù)據(jù)大小沒有限制

POST 方法可以設(shè)置書簽

74、鏈表逆序

鏈表逆序就是把一個鏈表按照原來的鏈接順序逆序?qū)崿F(xiàn)(也就是將頭變成尾辟躏,尾變成頭)谷扣。

編程思路:其實最關(guān)鍵的是先通過原來的鏈接順序找到下個節(jié)點,然后再把前個節(jié)點反序捎琐。

75会涎、假定輸入的字符串中只包含字母和* 號。編寫函數(shù)fun飘弧,功能是其兴,除了中間和尾部的*號外伸但,

將字符串中其他* 號全部刪除。編寫時练慕,不用c的其他函數(shù)惰匙。

例:*****A*BC*DEF*G****? ? 結(jié)果為:A*BC*DEF*G****

void fun (char *a){

int j=0;

char *p=a;

while (*p==’*')p++;

while (*p){

a[j++]=*p;

p++;

}

a[j]=0;

}

76、objective-c 中的數(shù)字對象都有哪些铃将,簡述它們與基本數(shù)據(jù)類型的區(qū)別是什么项鬼?

在OC 中NSNumber是數(shù)字對象,可以進行拆裝箱操作劲阎!

// 將int 轉(zhuǎn)為NSNumber

NSNumber *num = [NSNumber numberWithInt:123];

// 得到一個int

inttestNum = [numintValue];

77绘盟、do-while 與 while-do 的區(qū)別?

do-while 先執(zhí)行循環(huán)體悯仙,然后判斷條件龄毡,如果條件判斷為ture ,則繼續(xù)執(zhí)行循環(huán)體锡垄,如果判斷為false沦零,則不執(zhí)行循環(huán)體

while-do 是先判斷條件是否正確,若正確則執(zhí)行循環(huán)體偎捎,若不正確則不執(zhí)行循環(huán)體蠢终。

所以do-while 至少循環(huán)一次,而while-do有可能一次也不循環(huán)茴她。

78寻拂、類變量的@protected ,@private,@public,@package,聲明各有什么含義丈牢?

@private:作用范圍只能在自身類

@protected:作用范圍在自身類和繼承自己的子類? (默認)

@public:作用范圍最大祭钉,可以在任何地方被訪問。

@package:這個類型最常用于框架類的實例變量,同一包內(nèi)能用己沛,跨包就不能訪問

79慌核、談?wù)勀銓Χ嗑€程開發(fā)的理解?ios中有幾種實現(xiàn)多線程的方法申尼?

好處:

1.使用線程可以把占據(jù)時間長的程序中的任務(wù)放到后臺去處理

2.用戶界面可以更加吸引人垮卓,這樣比如用戶點擊了一個按鈕去觸發(fā)某些事件的處理,可以彈出一個進度條來顯示處理的進度

3.程序的運行速度可能加快

4·在一些等待的任務(wù)實現(xiàn)上如用戶輸入师幕、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等粟按,線程就比較有用了。

缺點:

1.如果有大量的線程,會影響性能,因為操作系統(tǒng)需要在它們之間切換霹粥。

2.更多的線程需要更多的內(nèi)存空間灭将。

3.線程的中止需要考慮其對程序運行的影響。

4.通常塊模型數(shù)據(jù)是在多個線程間共享的后控,需要防止線程死鎖情況的發(fā)生庙曙。

實現(xiàn)多線程的方法:NSObject類方法、NSThread浩淘、NSOperation捌朴、GCD

80吴攒、假設(shè)有一個字符串a(chǎn)abcad,請寫一段程序男旗,去掉字符串中不相鄰的重復(fù)字符串舶斧,即上述字符串處理之后的輸出結(jié)果為:aabcd

1、NSMutableString * str = [[NSMutableString alloc]initWithFormat;@“aabcad”];

for (int i = 0 ,i < str.length - 1 ;i++){

? ? unsigned char a = [str characterAtIndex:i];

? ? for (int j = i + 1 ,j < str.length ,j++){

? ? ? ? unsigned char b = [str characterAtIndex:j];

? ? ? ? if (a == b ){

? ? ? ? ? ? if (j == i + 1){

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? [str deleteCharactersInRange:NSMakeRange(j, 1)];

? ? ? ? ? ? }

? ? ? ? }

? ? }

}

NSLog(@“%@”,str);

81察皇、ViewController 的 alloc茴厉,loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分別是在什么時候調(diào)用的什荣?在自定義ViewController的時候這幾個函數(shù)里面應(yīng)該做什么工作矾缓?

alloc申請內(nèi)存時調(diào)用

loadView加載視圖時調(diào)用

ViewDidLoad視圖已經(jīng)加載后調(diào)用

ViewWillAppear視圖將要出現(xiàn)時調(diào)用

ViewDidUnload視圖已經(jīng)加載但沒有加載出來調(diào)用

dealloc銷毀該視圖時調(diào)用

init視圖初始化時調(diào)用

82、應(yīng)用如何找到最合適的控件來處理事件稻爬?

1.首先判斷主窗口(keyWindow)自己是否能接受觸摸事件

2.判斷觸摸點是否在自己身上

3.子控件數(shù)組中從后往前遍歷子控件嗜闻,重復(fù)前面的兩個步驟(所謂從后往前遍歷子控件,就是首先查找子控件數(shù)組中最后一個元素桅锄,然后執(zhí)行1琉雳、2步驟)

4.view,比如叫做fitView友瘤,那么會把這個事件交給這個fitView翠肘,再遍歷這個fitView的子控件,直至沒有更合適的view為止辫秧。

5.如果沒有符合條件的子控件束倍,那么就認為自己最合適處理這個事件,也就是自己是最合適的view

83盟戏、事件的傳遞和響應(yīng)的區(qū)別:

事件的傳遞是從上到下(父控件到子控件)绪妹,事件的響應(yīng)是從下到上(順著響應(yīng)者鏈條向上傳遞:子控件到父控件。

84柿究、簡述你對UIView UIWindow 和CALayer的理解

UIView和CALayer都是源自NSObject邮旷。

1、UIView的繼承結(jié)構(gòu)為:UIResponder:NSObject蝇摸±纫疲可以看出UIView的直接父類為UIResponder類。

可見UIResponder是用來響應(yīng)事件的探入,也就是說UIView可以響應(yīng)用戶事件。

2.CALayer的繼承結(jié)構(gòu):NSObject

直接從NSObject繼承懂诗,因為缺少了UIResponder類蜂嗽,所以CALayer不能響應(yīng)任何的用戶事件。

它們分別所屬的框架

1.UIView是在/System/Library/Frameworks/UIKit.framework中定義的殃恒。

我們都知道UIKit主要是用來構(gòu)建用戶界面并且是可以響應(yīng)事件的植旧。

2.CALayer是在/System/Library/Frameworks/QuartzCore.framework定義的辱揭。而且CALayer作為一個低級的可以承載繪制內(nèi)容的底層對象出現(xiàn)在該框架中。

綜上來看UIView與CALayer的最大區(qū)別在于UIView可以響應(yīng)用戶事件病附,而CALayer不可以问窃。UIView側(cè)重于對顯示內(nèi)容的管理,CALayer側(cè)重于對內(nèi)容的繪制完沪。

由此可見UIView確實是CALayer 的高級封裝域庇。

UIView和CALayer相互依賴,UIView依賴于CALayer提供的內(nèi)容覆积,CALayer依賴UIView提供的容器來顯示繪制的內(nèi)容听皿。但歸根到底CALayer是這一切的基礎(chǔ),如果沒有CALayer宽档,UIView自身也不會存在尉姨,UIView是一個特殊的CALayer的實現(xiàn),添加了響應(yīng)事件的能力吗冤。

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

iOS程序啟動完畢后覆致,創(chuàng)建的第一個視圖控件就是UIWindow,接著創(chuàng)建控制器的view降传,最后將控制器的view添加到UIWindow上篷朵,于是控制器的view就顯示在屏幕上了。一個iOS程序之所以能顯示到屏幕上婆排,完全是因為它有UIWindow声旺。即沒有UIWindow,就看不見任何UI界面段只。

85腮猖、簡述聲明一個屬性時,使用copy與strong的區(qū)別

1) 當原字符串是NSString時赞枕,字符串是不可變的澈缺,不管是Strong還是Copy屬性的對象,都是指向原對象炕婶,Copy操作只是做了次淺拷貝姐赡。

2) 當原字符串是NSMutableString時,Strong屬性只是增加了原字符串的引用計數(shù)柠掂,而Copy屬性則是對原字符串做了次深拷貝项滑,產(chǎn)生一個新的對象,且Copy屬性對象指向這個新的對象,且這個Copy屬性對象的類型始終是NSString涯贞,而不是NSMutableString枪狂,因此其是不可變的危喉。

3) 這里還有一個性能問題,即在原字符串是NSMutableString州疾,Strong是單純的增加對象的引用計數(shù)辜限,而Copy操作是執(zhí)行了一次深拷貝,所以性能上會有所差異(雖然不大)严蓖。如果原字符串是NSString時薄嫡,則沒有這個問題。

所以谈飒,在聲明NSString屬性時岂座,到底是選擇strong還是copy,可以根據(jù)實際情況來定杭措。不過费什,一般我們將對象聲明為NSString時,都不希望它改變手素,所以大多數(shù)情況下鸳址,我們建議用copy,以免因可變字符串的修改導(dǎo)致的一些非預(yù)期問題泉懦。


86稿黍、objc中的類方法和實例方法有什么區(qū)別

實例方法:實例出的對象所用的方法,原理是向某個對象發(fā)送一條消息,如果對象中有相應(yīng)的消息就會做出回應(yīng),OC用的就是這種消息模式.

類方法:也叫靜態(tài)方法,不需要申明一個對象,可以直接調(diào)用,一般是有返回值的,其主要作用就是返回一個對應(yīng)的實例(如數(shù)組,字符串或者就是本類的一個對象等),

類方法

類方法屬于類對象

類方法只能通過類對象調(diào)用

類方法中的self是類對象

類方法可以調(diào)用其他類方法

類方法中不能訪問成員變量

類方法不能直接調(diào)用對象方法

實例方法

實例方法是屬于實例對象的

實例方法只能呢通過實例對象調(diào)用

實例方法中的self是實例對象

實例方法中可以訪問成員變量

實例方法中直接調(diào)用實例方法

實例方法中也可以調(diào)用類方法(通過類名)

87、如果gcd創(chuàng)建3個任務(wù)崩哩,如何取消最后一個

GCD原生并不支持取消操作巡球。

dispatch_suspend函數(shù)也只能暫停開啟新的未執(zhí)行的block,已經(jīng)處于執(zhí)行中的block是無法暫停的邓嘹。

但是酣栈,通過參考NSOperation的cancel機制,你只要加一個外邊變量汹押,用于標記block是否需要取消矿筝。然后block中通過及時的檢測這個外部變量的狀態(tài),當發(fā)現(xiàn)需要取消時棚贾,停止block中的后續(xù)操作窖维,釋放資源。就能達到及時取消block的目的妙痹。這里有個例子:

https://github.com/Tinghui/HUIGCDDispatchAsync

88铸史、請簡述AFNetWorking的實現(xiàn)原理

NSURLConnection + NSOperation

NSURLConnection 是 Foundation URL 加載系統(tǒng)的基石。一個 NSURLConnection 異步地加載一個NSURLRequest 對象怯伊,調(diào)用 delegate 的 NSURLResponse / NSHTTPURLResponse 方法沛贪,其 NSData 被發(fā)送到服務(wù)器或從服務(wù)器讀取;delegate 還可用來處理 NSURLAuthenticationChallenge利赋、重定向響應(yīng)、或是決定 NSCachedURLResponse 如何存儲在共享的 NSURLCache 上猩系。

NSOperation 是抽象類媚送,模擬單個計算單元,有狀態(tài)寇甸、優(yōu)先級塘偎、依賴等功能,可以取消拿霉。

AFNetworking 的第一個重大突破就是將兩者結(jié)合吟秩。AFURLConnectionOperation 作為 NSOperation 的子類,遵循 NSURLConnectionDelegate 的方法绽淘,可以從頭到尾監(jiān)視請求的狀態(tài)涵防,并儲存請求、響應(yīng)沪铭、響應(yīng)數(shù)據(jù)等中間狀態(tài)壮池。

89、下面的代碼輸出什么杀怠?

@implementation Son : Father

- (id)init

{

self = [super init];

if (self) {

NSLog(@"%@", NSStringFromClass([self class]));

NSLog(@"%@", NSStringFromClass([super class]));

}

return self;

}

@end

2016-05-13 17:52:51.694 Test[12816:262134] Son

2016-05-13 17:52:51.696 Test[12816:262134] Son

原因:調(diào)用父類初始化的時候椰憋,是不看指針看對象的,因此誰調(diào)用super誰就是super的擁有者

90赔退、SDWebImage的原理

1.入口

setImageWithURL:placeholderImage:options: 會先把placeholderImage展示,然后 SDWebImageManager根據(jù)URL開始處理圖片.

2.進入

SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交給SDImageCache從緩存查找圖片是否已經(jīng)下載 :

通過: queryDiskCacheForKey:delegate:userInfo:.

3.先從內(nèi)存圖片緩存查找是否有圖片,如果內(nèi)存中已經(jīng)有圖片緩存SDWebImageDelegate回調(diào)imageCache:didFindImage:ForKey:userInfo: 到SDWebImageManager

4.SDWebImageManagerDelegate回調(diào)

webImageManager:didFinishWithImage:

到UIImageView+WebCache等前端展示圖片

5.如果內(nèi)存緩存中沒有橙依,生成NSInvocationOperation添加到隊列開始從硬盤查找圖片是否已經(jīng)緩存。

6.根據(jù) URLKey 在硬盤緩存目錄下嘗試讀取圖片文件.這一步是在 NSOperation 進行的操作,所以回主線程進行結(jié)果回調(diào).

7.如果上一操作從硬盤讀取到了圖片,將圖片添加到內(nèi)存緩存中,如果內(nèi)存空間過小會先清空內(nèi)存緩存.

SDImageCacheDelegate回調(diào) imageCache:didFindImage:forKey:userInfo: 進而回調(diào)展示圖片.

8.如果從硬盤緩存目錄讀取不到圖片硕旗,說明所有緩存都不存在該圖片窗骑,需要下載圖片,回調(diào)imageCache:didNotFindImageForKey:userInfo:卵渴。

9.共享或重新生成一個下載器 SDWebImageDownloder開始下載圖片

10.圖片下載由 NSURLConnection來做,實現(xiàn)相關(guān)的Delegate來判斷圖片下載中,下載完成和下載失敗.

11.connection:didReceiveData:中利用 ImageIO 做了按圖片下載進度加載效果慧域。

12.connectionDidFinishLoading: 數(shù)據(jù)下載完成后交給 SDWebImageDecoder 做圖片解碼處理。

13.圖片解碼處理在一個 NSOperationQueue 完成浪读,不會拖慢主線程 UI昔榴。如果有需要對下載的圖片進行二次處理,最好也在這里完成碘橘,效率會好很多互订。

14.在主線程notifyDelegateOnMainThreadWithInfo:宣告解碼完成,imageDecoder:didFinishDecodingImage:userInfo:回調(diào)給 SDWebImageDownloader痘拆。

15.imageDownloader:didFinishWithImage: 回調(diào)給 SDWebImageManager 告知圖片下載完成仰禽。

16.通知所有的 downloadDelegates 下載完成,回調(diào)給需要的地方展示圖片。

17.將圖片保存到 SDImageCache 中吐葵,內(nèi)存緩存和硬盤緩存同時保存规揪。寫文件到硬盤也在以單獨 NSInvocationOperation 完成,避免拖慢主線程温峭。

18.SDImageCache 在初始化的時候會注冊一些消息通知猛铅,在內(nèi)存警告或退到后臺的時候清理內(nèi)存圖片緩存,應(yīng)用結(jié)束的時候清理過期圖片凤藏。

19.SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache奸忽,方便使用。

20.SDWebImagePrefetcher 可以預(yù)先下載圖片揖庄,方便后續(xù)使用

91栗菜、BAD_ACCESS在什么情況下出現(xiàn)?如何調(diào)試BAD_ACCESS錯誤蹄梢?

什么是 EXC_BAD_ACCESS?

不管什么時候當你遇到EXC_BAD_ACCESS這個錯誤疙筹,那就意味著你向一個已經(jīng)釋放的對象發(fā)送消息。訪問了野指針检号,比如對一個已經(jīng)釋放的對象執(zhí)行了release腌歉、訪問已經(jīng)釋放對象的成員變量或者發(fā)消息。

EXC_BAD_ACCESS的本質(zhì)

技術(shù)層面的解釋有些復(fù)雜齐苛。在C和Objective-C中翘盖,你一直在處理指針。指針無非是存儲另一個變量的內(nèi)存地址的變量凹蜂。當您向一個對象發(fā)送消息時馍驯,指向該對象的指針將會被引用。這意味著玛痊,你獲取了指針所指的內(nèi)存地址汰瘫,并訪問該存儲區(qū)域的值。

當該存儲器區(qū)域不再映射到您的應(yīng)用時擂煞,或者換句話說混弥,該內(nèi)存區(qū)域在你認為使用的時候卻沒有使用,該內(nèi)存區(qū)域是無法訪問的对省。 這時內(nèi)核會拋出一個異常( EXC )蝗拿,表明你的應(yīng)用程序不能訪問該存儲器區(qū)域(BAD ACCESS) 。

總之蒿涎,當你碰到EXC_BAD_ACCESS 毅贮,這意味著你試圖發(fā)送消息到的內(nèi)存塊的妖,但內(nèi)存塊無法執(zhí)行該消息。但是巩趁,在某些情況下魄健, EXC_BAD_ACCESS是由被損壞的指針引起的。每當你的應(yīng)用程序嘗試引用損壞的指針,一個異常就會被內(nèi)核拋出。

調(diào)試EXC_BAD_ACCESS

1.重寫object的respondsToSelector方法呀伙,現(xiàn)實出現(xiàn)EXEC_BAD_ACCESS前訪問的最后一個object

2.通過 Zombie

3.設(shè)置全局斷點快速定位問題代碼所在行

4.Xcode 7 已經(jīng)集成了BAD_ACCESS捕獲功能:Address Sanitizer。 用法如下:在配置中勾選?Enable Address Sanitizer

92添坊、找錯誤(1)

char * GetMemory(void){

char p[] = "Hello World";

return p;

}

int main(int argc, const char * argv[]) {

@autoreleasepool {

char * str = NULL;

str = GetMemory();

printf("%s\n",str);

}

return 0;

}

錯誤為:

char p[] = "Hello World";

return p;//不能返回棧地址区匠,因為棧空間自動釋放帅腌,應(yīng)該返回棧空間的數(shù)據(jù)

正確應(yīng)該為:

char *p = "Hello World";

93麻汰、找錯誤(2)

void GetMemory(char **p, int num){

*p = (char *)malloc(num);

}

void Test(void){

char * str = NULL;

GetMemory(&str, 100);

strcpy(str, "Hello");

printf(str);

}

// 堆空間需要手動釋放速客,申請了堆內(nèi)存時也要判斷是否申請成功

char * str = NULL;

GetMemory(&str, 100);

if(str) {

strcpy(str, "Hello");

printf("%s",str);

free(str);

str = NULL;

}

94、寫出下列兩個屬性的Setter方法

@property (nonatomic, retain) NSString * name;

@property (nonatomic, copy) NSString * name;

- (void) setName:(NSString *) name {

if( _name != name) {

?[_name release];

_name = [name retain];

}

}

- (void) setName:(NSString *) name {

_name = [name copy];

}

retain修飾的屬性setter方法的實現(xiàn)步驟:

1:判斷新值與舊值是否相等五鲫,如果不等執(zhí)行以下操作

2:將舊值執(zhí)行一次release操作(舊值release)

3:再將新值執(zhí)行一次retain操作再賦給舊值(新值retain再賦值)

copy修飾的屬性:如果要保證返回的是一個不可變的版本就要將新值執(zhí)行一次copy操作

95溺职、類別和繼承什么區(qū)別

1.類別是對方法的擴展,不能添加成員變量位喂。繼承可以在原來父類的成員變量的基礎(chǔ)上浪耘,添加新的成員變量

2.類別只能添加新的方法,不能修改和刪除原來的方法塑崖。繼承可以增加七冲、修改和刪除方法。

3.類別不提倡對原有的方法進行重載规婆。繼承可以通過使用super對原來方法進行重載澜躺。

4.類別可以被繼承,如果一個父類中定義了類別抒蚜,那么其子類中也會繼承此類別掘鄙。

96、線程與進程的區(qū)別和聯(lián)系

進程: 進程是一個“執(zhí)行中的程序”嗡髓。程序是一個沒有生命的實體操漠,只有處理器賦予程序生命時,它才能成為一個活動的實體饿这,我們稱其為進程浊伙。進程是一個具有獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動。它可以申請和擁有系統(tǒng)資源蛹稍,是一個動態(tài)的概念吧黄,是一個活動的實體。它不只是程序的代碼唆姐,還包括當前的活動拗慨,通過程序計數(shù)器的值和處理寄存器的內(nèi)容來表示。

線程: 通常在一個進程中可以包含若干個線程,它們可以利用進程所擁有的資源赵抢。在引入線程的操作系統(tǒng)中剧蹂,通常都是把進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調(diào)度的基本單位烦却。由于線程比進程更小宠叼,基本上不擁有系統(tǒng)資源,故對它的調(diào)度所付出的開銷就會小得多其爵,能更高效的提高系統(tǒng)內(nèi)多個程序間并發(fā)執(zhí)行的程度冒冬。

線程與進程的區(qū)別:

a.地址空間和其它資源:進程間相互獨立,同一進程的各線程間共享摩渺。某進程內(nèi)的線程在其它進程不可見简烤。

b.通信:進程間通信IPC,線程間可以直接讀寫進程數(shù)據(jù)段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助摇幻,以保證數(shù)據(jù)的一致性横侦。

c.調(diào)度和切換:線程上下文切換比進程上下文切換要快得多。

d.在多線程OS中绰姻,進程不是一個可執(zhí)行的實體

97枉侧、數(shù)組去重有哪些方式

1)、利用NSDictionary的AllKeys(AllValues)方法

NSMutableDictionary *dic = [[NSMutableDictionary alloc]initWithCapacity:0];

for(NSString *str in dataArray){

[dic setValue:str forKey:str];

}

2)狂芋、利用NSSet的AllObjects方法

NSSet *set = [NSSet setWithArray:dataArray];

NSLog(@"%@",[set allObjects]);

3)榨馁、利用數(shù)組的containsObject來去除

NSMutableArray *listAry = [[NSMutableArray alloc]init];

for (NSString *str in dataArray) {

if (![listAry containsObject:str]) {

[listAry addObject:str];

}

}

98、同時實現(xiàn)一個property 屬性的setter 和 getter的方法银酗,調(diào)用_ivar會報錯

在.h或者.m文件中用@property聲明一個屬性時辆影。如果同時重寫getter和setter方法,會報“該變量沒有定義的錯誤”黍特。

解決辦法:.m文件中需要加上:

@synthesize propertyName = _propertyName;

原因:因為@property默認給該屬性生成getter和setter方法蛙讥,當getter和setter方法同時被重寫時,則系統(tǒng)就不會自動生成getter和setter方法了灭衷,也不會自動幫你生成_num變量次慢,所以不會識別。

小知識:聲明的property如果沒有特意指定synthesize的話翔曲,那么Objective-C就會自動的給你聲明一個_開頭的實例變量迫像。

_xxx訪問的是xxx的地址。self.xxx訪問的是xxx的getter瞳遍。這兩者并不是完全等價的,self.xxx是用objc_msgSend發(fā)消息闻妓,_xxx或者self->xxx則是直接訪問內(nèi)存地址,一般建議在init里面用_xxx掠械,其他地方用self.xxx.

99由缆、@property (copy) NSMutableArray *array;這個寫法會有什么問題注祖?

即使在MRC時代,我們通常會寫成retain,在ARC時代,我們會寫成strong,所以copy會略顯奇怪

嘗試分析一下,copy為內(nèi)容拷貝,和源對象變成2個擁有相同內(nèi)容的不同指針,互不影響.

并且因為調(diào)用copy方法,所以該array屬性在RunTime的時候,實際上為NSArray,即無法調(diào)用add等方法,但是編譯期調(diào)用是合法的,所以可能會造成crash.

100、@property的本質(zhì)是什么均唉?ivar是晨、getter、setter是如何生成并添加到這個類的

@property = ivar + getter + setter

“屬性”(@property)有兩大概念:實例變量(ivar)舔箭、存取方法(access method = getter + setter)罩缴。

“屬性” (property)作為 Objective-C 的一項特性,主要的作用就在于封裝對象中的數(shù)據(jù)层扶。 objective-c 對象通常會把其所需要的數(shù)據(jù)保存為各種實例變量箫章。實例變量一般通過“存取方法”(access method)來訪問。

ivar镜会、 getter炉抒、setter是如何生成并添加到這個類的?

自動合成(autosynthesis)

完成屬性定以后稚叹,編譯器會自動編寫訪問這些屬性所需的方法,此過程叫做“自動合成”(autosynthesis)拿诸。需要強調(diào)的是扒袖,這一過程是在編譯期間執(zhí)行的。除了生成方法代碼getter亩码、setter之外季率,編譯器還要自動向類中添加適當?shù)念愋偷膶嵗兞浚⑶覍傩悦懊嫣砑酉聞澗€描沟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末飒泻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吏廉,更是在濱河造成了極大的恐慌泞遗,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件席覆,死亡現(xiàn)場離奇詭異史辙,居然都是意外死亡,警方通過查閱死者的電腦和手機佩伤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門聊倔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人生巡,你說我怎么就攤上這事耙蔑。” “怎么了孤荣?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵甸陌,是天一觀的道長须揣。 經(jīng)常有香客問我,道長邀层,這世上最難降的妖魔是什么返敬? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮寥院,結(jié)果婚禮上劲赠,老公的妹妹穿的比我還像新娘。我一直安慰自己秸谢,他們只是感情好凛澎,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著估蹄,像睡著了一般塑煎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上臭蚁,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天最铁,我揣著相機與錄音,去河邊找鬼垮兑。 笑死冷尉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的系枪。 我是一名探鬼主播雀哨,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼私爷!你這毒婦竟也來了雾棺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤衬浑,失蹤者是張志新(化名)和其女友劉穎捌浩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體工秩,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡嘉栓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拓诸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侵佃。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奠支,靈堂內(nèi)的尸體忽然破棺而出馋辈,到底是詐尸還是另有隱情,我是刑警寧澤倍谜,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布迈螟,位于F島的核電站叉抡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏答毫。R本人自食惡果不足惜褥民,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洗搂。 院中可真熱鬧消返,春花似錦、人聲如沸耘拇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惫叛。三九已至倡勇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嘉涌,已是汗流浹背妻熊。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仑最,地道東北人固耘。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像词身,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子番枚,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,359評論 0 35
  • 多線程法严、特別是NSOperation 和 GCD 的內(nèi)部原理。運行時機制的原理和運用場景葫笼。SDWebImage的原...
    LZM輪回閱讀 2,009評論 0 12
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 1,988評論 0 7
  • __block和__weak修飾符的區(qū)別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用深啤,...
    LZM輪回閱讀 3,327評論 0 6
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,160評論 30 470