iOS面試題 2016版?

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。

1. OC中,與alloc語(yǔ)義相反的方法是dealloc還是release?與retain語(yǔ)義相反的方法是dealloc還是release?為什么?需要與alloc配對(duì)使用的方法是dealloc還是release,為什么?
以下是針對(duì)MRC(手動(dòng)內(nèi)存釋放)模式:
與alloc語(yǔ)義相反的方法是dealloc,與retain語(yǔ)義相反的方法是release。
alloc是為對(duì)象在內(nèi)存中開(kāi)辟空間,而dealloc則是對(duì)象銷(xiāo)毀時(shí)釋放空間。
retain方法是對(duì)象開(kāi)辟空間以后使對(duì)象的引用計(jì)數(shù)器加1,而release是對(duì)象的引用計(jì)數(shù)器減1。
需要與alloc配對(duì)的方法是release,因?yàn)閷?duì)象創(chuàng)建以后,對(duì)象的引用計(jì)數(shù)器自動(dòng)加1,
而調(diào)用release方法后,對(duì)象的引用計(jì)數(shù)器歸0,系統(tǒng)會(huì)自動(dòng)調(diào)用dealloc方法釋放空間。
2. 在一個(gè)對(duì)象的方法里面:self.name = @"object";和 _name = @"object"有什么不同嗎?
self.name = @"object"; 是通過(guò)點(diǎn)語(yǔ)法修改屬性name的值。
本質(zhì)上使用的是name屬性的setter方法進(jìn)行的賦值操作,實(shí)際上執(zhí)行的代碼是
[self setName:@"object"];
例如:
@property(nonatomic, strong) NSString *name;
//根據(jù)@property關(guān)鍵詞,系統(tǒng)自動(dòng)生成setter方法。

  • (void)setName:(NSString *)name{
    //根據(jù)strong關(guān)鍵詞
    [name retain]; //內(nèi)存計(jì)數(shù)+1
    [_name release]; //把之前指針指向的內(nèi)容內(nèi)存計(jì)數(shù)-1
    _name = name; //指向新內(nèi)容
    }
    _name = @“object”; 只是單純的把‘_name’指針指向‘@"object"’字符串對(duì)象所在的地址,
    沒(méi)有調(diào)用方法。
    3. 這段代碼有什么問(wèn)題嗎?
    -(void)setAge:(int)newAge{
    self.age = newAge;
    }
    在age屬性的setter方法中,不能通過(guò)點(diǎn)語(yǔ)法給該屬性賦值。
    會(huì)造成setter方法的循環(huán)調(diào)用。因?yàn)閟elf.age = newAge;
    本質(zhì)上是在調(diào)用 [self setAge:newAge]; 方法。
    解決循環(huán)調(diào)用的方法是方法體修改為 _age = newAge;
    另外 變量名稱不能使用new開(kāi)頭!
    4. 以下每行代碼執(zhí)行后,person對(duì)象的retain count分別是多少?
    Person *person = [[Person alloc] init];
    [person retain];
    [person release];
    [person release];
    Person *person = [[Person alloc] init]; =1
    [person retain]; +1 = 2
    [person release]; -1 = 1
    [person release]; -1 = 0
    內(nèi)存計(jì)數(shù)技術(shù)規(guī)律
    alloc,new,copy 內(nèi)存計(jì)數(shù) = 1
    retain +1
    release -1
    UIView addSubview +1
    NSMutableArray addObject +1
    5. 這段代碼有什么問(wèn)題,如何修改?
    for(int i = 0; i < someLargeNumber; i++){
    NSString *string = @“Abc”;
    string = [string lowercaseString];
    string = [string stringByAppendingString:@“xyz”];
    NSLog(@“%@“, string);
    }
    代碼本身不會(huì)報(bào)錯(cuò)。
    但是猜測(cè)出題者的意思是要循環(huán)添加為 abcxyzxyzxyz.....這樣的形式。
    如果是想在Abc后面拼接多個(gè)xyz字符串的話,
    則需要把"NSString *string = @“Abc”;" 這行代碼放在循環(huán)語(yǔ)句外面。
    6. 簡(jiǎn)要敘述面向?qū)ο蟮奶攸c(diǎn),特別是多態(tài)。
  1. 封裝
    封裝是對(duì)象和類(lèi)概念的主要特性。它是隱藏內(nèi)部實(shí)現(xiàn),提供外部接口,可以看作是“包裝”。
    封裝,也就是把客觀事物封裝成抽象的類(lèi),并且類(lèi)可以把自己的數(shù)據(jù)和方法只讓可信的類(lèi)或者對(duì)象操作,
    對(duì)不可信的進(jìn)行信息隱藏。
    封裝的目的是增強(qiáng)安全性和簡(jiǎn)化編程,使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只是要通過(guò)外部接口,
    以特定的訪問(wèn)權(quán)限來(lái)使用類(lèi)的成員。
    好處:可以隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。通過(guò)大量功能類(lèi)封裝,加快后期開(kāi)發(fā)速度。
  2. 繼承
    面向?qū)ο缶幊?(OOP) 語(yǔ)言的一個(gè)主要功能就是“繼承”。
    繼承是指這樣一種能力:它可以使用現(xiàn)有類(lèi)的所有功能,并在無(wú)需重新編寫(xiě)原來(lái)的類(lèi)的情況下
    對(duì)這些功能進(jìn)行擴(kuò)展。
    通過(guò)繼承創(chuàng)建的新類(lèi)稱為“子類(lèi)”或“派生類(lèi)”,被繼承的類(lèi)稱為“基類(lèi)”、“父類(lèi)”或“超類(lèi)”。
    繼承的過(guò)程,就是從一般到特殊的過(guò)程。在考慮使用繼承時(shí),有一點(diǎn)需要注意,
    那就是兩個(gè)類(lèi)之間的關(guān)系應(yīng)該是“屬于”關(guān)系。
    例如,Employee(雇員)是一個(gè)人,Manager(領(lǐng)導(dǎo))也是一個(gè)人,因此這兩個(gè)類(lèi)都可以繼承Person類(lèi)。
    但是 Leg(腿) 類(lèi)卻不能繼承 Person 類(lèi),因?yàn)橥炔⒉皇且粋€(gè)人。
  3. 多態(tài)
    多態(tài)性(polymorphism)是允許你將父對(duì)象設(shè)置成為和一個(gè)或更多的他的子對(duì)象相等的技術(shù),
    賦值之后,父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作。
    簡(jiǎn)單的說(shuō),就是一句話:允許將子類(lèi)類(lèi)型的指針賦值給父類(lèi)類(lèi)型的指針。
    不同對(duì)象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。
    意思就是假設(shè)生物類(lèi)(life)都用有一個(gè)相同的 方法-eat;那人類(lèi)屬于生物,豬也屬于生物,
    都繼承了life后,實(shí)現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法。
    也就是不同的對(duì)象以 自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個(gè)選擇器)。
    實(shí)現(xiàn)多態(tài),有二種方式,覆蓋,重載。
    ? 覆蓋(override),是指子類(lèi)重新定義父類(lèi)的虛函數(shù)的做法。
    ? 重載(overload),是指允許存在多個(gè)同名函數(shù),而這些函數(shù)的參數(shù)表不同
    (或許參數(shù)個(gè)數(shù)不同,或許參數(shù)類(lèi)型不同,或許兩者都不同)。
    ** 這里注意:OC沒(méi)有重載,因?yàn)镺C只認(rèn)函數(shù)名,不認(rèn)參數(shù)類(lèi)型。OC不允許存在多個(gè)同名函數(shù)。
    總結(jié):封裝可以隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼模塊化;繼承可以擴(kuò)展已存在的代碼模塊(類(lèi));
    它們的目的都是為了——代碼重用。
    而多態(tài)則是為了實(shí)現(xiàn)另一個(gè)目的——接口重用!
    多態(tài)的作用,就是為了類(lèi)在繼承和派生的時(shí)候,保證使用“家譜”中任一類(lèi)的實(shí)例的某一屬性時(shí)的正確調(diào)用。
    在類(lèi)層次中,子類(lèi)只繼承一個(gè)父類(lèi)的數(shù)據(jù)結(jié)構(gòu)和方法,則稱為單重繼承。
    在類(lèi)層次中,子類(lèi)繼承了多個(gè)父類(lèi)的數(shù)據(jù)結(jié)構(gòu)和方法,則稱為多重繼承。
    7. objective-c 所有對(duì)象間的交互是如何實(shí)現(xiàn)的?
    在對(duì)象間交互中每個(gè)對(duì)象承擔(dān)的角色不同,但總的來(lái)說(shuō)無(wú)非就是”數(shù)據(jù)的發(fā)送者”或”數(shù)據(jù)的接收者”兩種角色。消息的正向傳遞比較簡(jiǎn)單,直接拿到接受者的指針即可。消息的反響傳遞可以通過(guò)委托模式,觀察者模式(本質(zhì)是單例模式),block語(yǔ)法,AppDelegagte來(lái)實(shí)現(xiàn)。其中委托模式,block語(yǔ)法都是1對(duì)1的消息傳遞。 觀察者模式是1對(duì)多。AppDelegate比較特殊,這是一個(gè)生命周期與進(jìn)程一致的對(duì)象。
    8. 什么叫數(shù)據(jù)結(jié)構(gòu)?
    數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式。是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。通常,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來(lái)更高的運(yùn)行或者存儲(chǔ)效率。
    9. OC的類(lèi)可以多繼承嗎?可以實(shí)現(xiàn)多個(gè)接口嗎?Category是什么?分類(lèi)中能定義成員變量或?qū)傩詥??為什么?重?xiě)一個(gè)類(lèi)的方式是繼承好還是類(lèi)別好?為什么?
    Object-c的類(lèi)不可以多重繼承;可以實(shí)現(xiàn)多個(gè)接口(協(xié)議),通過(guò)實(shí)現(xiàn)多個(gè)接口可以完成C++的多重繼承;Category是類(lèi)別,推薦使用類(lèi)別,用Category去重寫(xiě)類(lèi)的方法,僅對(duì)本引入Category的類(lèi)有效,不會(huì)影響到其他類(lèi)與原有類(lèi)的關(guān)系。
    10. #import和#include有什么區(qū)別?@class呢?#import<>和#import”“有什么區(qū)別?

import是Objective-C導(dǎo)入頭文件的關(guān)鍵字,#include是C/C++導(dǎo)入頭文件的關(guān)鍵字,使用#import頭文件會(huì)自動(dòng)只導(dǎo)入一次,不會(huì)重復(fù)導(dǎo)入,相當(dāng)于#include和#pragma once;@class告訴編譯器某個(gè)類(lèi)的聲明,當(dāng)執(zhí)行時(shí),才去查看類(lèi)的實(shí)現(xiàn)文件,可以解決頭文件的相互包含;#import<>用來(lái)包含系統(tǒng)的頭文件,#import””用來(lái)包含用戶頭文件。例如:/* 如果這里不寫(xiě)@class,則報(bào)錯(cuò)。 原因是找不到MyVC的定義。因?yàn)榇a執(zhí)行順序是由上至下的。當(dāng)聲明協(xié)議MyVCDelegate時(shí), MyVC還沒(méi)有聲明。使用 @class 名稱隨便寫(xiě),不管是否存在。 可以自己用代碼嘗試隨意寫(xiě)個(gè)@class 例如:@class Hello; 就算項(xiàng)目中根本沒(méi)有Hello類(lèi),這里也不會(huì)報(bào)錯(cuò)。 因?yàn)橹挥挟?dāng)項(xiàng)目運(yùn)行起來(lái),才會(huì)真的去檢查Hello類(lèi)是否聲明了。*/@class MyVC;@protocol MyVCDelegate- (void)myVC:(MyVC *)myVC click:(id)sender;

@end
@interface MyVC : BaseVC
@end
ps:iOS7之后的新特性,可以使用@import 關(guān)鍵詞來(lái)代理#import引入系統(tǒng)類(lèi)庫(kù)。
使用@import引入系統(tǒng)類(lèi)庫(kù),不需要到build phases中先添加添加系統(tǒng)庫(kù)到項(xiàng)目中。
11.屬性readwrite, readonly, assign, retain, copy, nonatomic各是什么作用?在哪種情況下用?
1.readwrite 是可讀可寫(xiě)特性;需要生成getter方法和setter方法時(shí)
(補(bǔ)充:默認(rèn)屬性,將生成不帶額外參數(shù)的getter和setter方法(setter方法只有一個(gè)參數(shù)))
2.readonly 是只讀特性,只會(huì)生成getter方法,不會(huì)生成setter方法;不希望屬性在類(lèi)外改變
3.assign 是賦值特性,setter方法將傳入?yún)?shù)賦值給實(shí)例變量;僅設(shè)置變量時(shí);
4.retain(MRC)/strong(ARC) 表示持有特性,setter方法將傳入?yún)?shù)先保留,
再賦值,傳入?yún)?shù)的retaincount會(huì)+1;
5.copy 表示拷貝特性,setter方法將傳入對(duì)象復(fù)制一份;需要完全一份新的變量時(shí)。
6.nonatomic 非原子操作,決定編譯器生成的setter和getter方法是否是原子操作。

  • atomic表示多線程安全,需要對(duì)方法加鎖,保證同一時(shí)間只有一個(gè)線程訪問(wèn)屬性,
    因?yàn)橛械却^(guò)程,所以影響執(zhí)行效率
  • 一般使用nonatomic。不加鎖。效率會(huì)更高。但是線程不安全。
    **12. 寫(xiě)一個(gè)setter方法用于完成@property(nonatomic, strong)NSString name, 寫(xiě)一個(gè)setter方法用于完成@property(nonatomic, copy)NSString name
  • (void)setName:(NSString*)str //retain
    {
    [str retain];
    [_name release];
    _name = str;
    }
  • (void)setName:(NSString *)str //copy
    {
    id t = [str copy];
    [_name release];
    _name = t;
    }
    *13. 對(duì)于語(yǔ)句N(xiāo)SString obj = [[NSData alloc] init]; obj在編譯時(shí)和運(yùn)行時(shí)分別是什么類(lèi)型的對(duì)象?
    編譯時(shí)是NSString的類(lèi)型;運(yùn)行時(shí)是NSData類(lèi)型的對(duì)象。
    14. 常見(jiàn)的OC的數(shù)據(jù)類(lèi)型有哪些? 和C的基本數(shù)據(jù)類(lèi)型有什么區(qū)別? 如:NSInteger和int
    object-c的數(shù)據(jù)類(lèi)型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等。
    C語(yǔ)言的基本數(shù)據(jù)類(lèi)型int,只是一定字節(jié)的內(nèi)存空間,用于存放數(shù)值;
    NSInteger類(lèi)型的定義是

if LP64 || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE)

|| TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;

else

typedef int NSInteger;
typedef unsigned int NSUInteger;

endif

可以看到,在64位操作系統(tǒng)上,NSInteger是 C語(yǔ)言的long類(lèi)型。
在32位操作系統(tǒng)上,則是int類(lèi)型。
15. id聲明的對(duì)象有什么特性?
id 聲明的對(duì)象具有運(yùn)行時(shí)的特性,即可以指向任意類(lèi)型的objcetive-c的對(duì)象;
可以作為返回值,也可以聲明對(duì)象。
例如

  • (id)initWithName:(NSString *)name;
    id obj = [NSObject new];
    現(xiàn)在我們使用蘋(píng)果推薦使用的“instancetype”類(lèi)型代替id類(lèi)型作為返回值
  • (instancetype)initWithName:(NSString *)name;
    instancetype和id的區(qū)別在于, id可以聲明對(duì)象 也可以作為返回值,
    instancetype只能作為返回值。
    16. OC如何對(duì)內(nèi)存管理的,說(shuō)說(shuō)你的看法和解決方法。
    Objective-C的內(nèi)存管理主要有三種方式ARC(自動(dòng)內(nèi)存計(jì)數(shù))、手動(dòng)內(nèi)存計(jì)數(shù)、內(nèi)存池。
  1. 自動(dòng)內(nèi)存計(jì)數(shù)ARC:由Xcode自動(dòng)在App編譯階段,在代碼中添加內(nèi)存管理代碼。
  2. 手動(dòng)內(nèi)存計(jì)數(shù)MRC:遵循內(nèi)存誰(shuí)申請(qǐng),誰(shuí)添加。誰(shuí)釋放的原則。
  3. 內(nèi)存釋放池Release Pool:把需要釋放的內(nèi)存統(tǒng)一放在一個(gè)池子中,當(dāng)池子被抽干后(drain)
    池子中所有的內(nèi)存空間也被自動(dòng)釋放掉。 內(nèi)存池的釋放操作分為自動(dòng)和手動(dòng)。
    自動(dòng)釋放受runloop機(jī)制影響。
    17. 你對(duì)@interface中的成員變量和@property聲明的屬性的理解。
    @interface AA: NSObject{
    NSString *_name; //成員變量
    }
    @property NSString *sex; //屬性
    如上所示:
    屬性擁有setter和getter方法 外加_sex成員變量。
    _name只是成員變量, 沒(méi)有setter和getter方法。
    18. do while 和while do的區(qū)別?
    while do是先判斷while中的表達(dá)式的真假,再執(zhí)行循環(huán)。
    do while先進(jìn)行循環(huán)一次,再判斷while中的表達(dá)式的真假。
    19. 用預(yù)處理指令#define聲明一個(gè)常數(shù),用以表明一年中有多少秒(忽略閏年問(wèn)題)。

define SECONDS_PER_YEAR (60 * 60 * 24 * 365)

20. 淺拷貝和深拷貝的區(qū)別?
淺拷貝:只復(fù)制指向?qū)ο蟮闹羔槪粡?fù)制引用對(duì)象本身。
深拷貝:復(fù)制引用和對(duì)象本身。
意思就是說(shuō)我有個(gè)A對(duì)象,復(fù)制一份后得到A_copy對(duì)象后,
對(duì)于淺復(fù)制來(lái)說(shuō),A和A_copy指向的是同一個(gè)內(nèi)存資源,復(fù)制的只不過(guò)是是一個(gè)指針,
對(duì)象本身資源還是只有一份。
那如果我們對(duì)A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對(duì)象同樣被修改,
這其實(shí)違背了我們復(fù)制拷貝的一個(gè)思想。
深復(fù)制就好理解了,內(nèi)存中存在了兩份獨(dú)立對(duì)象本身。
用網(wǎng)上一哥們通俗的話將就是:
淺拷貝好比你和你的影子,你完蛋,你的影子也完蛋
深拷貝好比你和你的克隆人,你完蛋,你的克隆人還活著。
21. 類(lèi)別的作用?繼承和類(lèi)別在實(shí)現(xiàn)中有何區(qū)別?
Category可以向類(lèi)中添加新的方法,或者重寫(xiě)已有方法。
正常情況下不可以添加屬性。但是實(shí)際應(yīng)用中可以通過(guò)runtime機(jī)制添加屬性。
類(lèi)別主要有3個(gè)作用:

  • 將類(lèi)的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中。降低耦合性。
  • 重寫(xiě)主類(lèi)方法
  • 向類(lèi)中添加協(xié)議,屬性,方法。
    繼承主要作用:
  • 重寫(xiě)父類(lèi)方法
  • 在父類(lèi)基礎(chǔ)上增加屬性,方法,協(xié)議
    區(qū)別:繼承使用時(shí),需要使用子類(lèi)。 Category使用時(shí)只需要引入頭文件。
    22. 我們說(shuō)的OC是動(dòng)態(tài)運(yùn)行時(shí)語(yǔ)言是什么意思?
    編譯時(shí)等價(jià)于編碼時(shí), 編碼時(shí)就是程序員寫(xiě)的代碼的樣子. 程序員為一個(gè)類(lèi)編寫(xiě)代碼,
    便可以為一個(gè)類(lèi)添加 “成員變量(實(shí)例變量)” . 程序員也可以在一個(gè)類(lèi)中寫(xiě)一些函數(shù), 被稱作“方法”.
    運(yùn)行前編譯, 編譯器會(huì)把程序員寫(xiě)的代碼編譯成可執(zhí)行文件, 里面便有之前寫(xiě)的類(lèi)的信息,
    包括實(shí)例變量方法, 這些信息并不能組成一個(gè)實(shí)際的數(shù)據(jù)類(lèi)型.
    程序運(yùn)行后, 會(huì)將這些信息拼湊成一個(gè)結(jié)構(gòu)體, 這個(gè)結(jié)構(gòu)體便是一個(gè)數(shù)據(jù)類(lèi)型.
    同時(shí), 在運(yùn)行期間, 數(shù)據(jù)類(lèi)型可以改變, 表現(xiàn)為:
  1. 可以動(dòng)態(tài)增添方法
  2. 可以動(dòng)態(tài)增添實(shí)例變量
    等等..做一些運(yùn)行時(shí)數(shù)據(jù)類(lèi)型修改.
    一旦做了運(yùn)行時(shí)修改, 就會(huì)使得這個(gè)結(jié)構(gòu)體與程序員當(dāng)初編寫(xiě)的類(lèi)不一樣.
    23. 為什么很多內(nèi)置類(lèi)如UITableView的delegate屬性都是assign而不是retain ?
    如果是retain會(huì)引起循環(huán)引用。
    所有的引用計(jì)數(shù)系統(tǒng),都存在循環(huán)引用的問(wèn)題。例如下面的引用關(guān)系:
    對(duì)象a創(chuàng)建并引用了對(duì)象b,對(duì)象b創(chuàng)建并引用了對(duì)象c,對(duì)象c創(chuàng)建并引用了對(duì)象b.
    這時(shí)候b和c的引用計(jì)數(shù)分別是2和1。當(dāng)a不再使用b,調(diào)用release釋放對(duì)b的所有權(quán),因?yàn)閏還引用了b。
    所以b的引用計(jì)數(shù)為1,b不會(huì)被釋放。b不釋放,c的引用計(jì)數(shù)就是1,c也不會(huì)被釋放。
    從此,b和c永遠(yuǎn)留在內(nèi)存中。
    這種情況,必須打斷循環(huán)引用,通過(guò)其他規(guī)則來(lái)維護(hù)引用關(guān)系。
    比如,我們常見(jiàn)的delegate往往是assign方式的屬性而不是retain方式的屬性,
    賦值不會(huì)增加引用計(jì)數(shù),就是為了防止delegation兩端產(chǎn)生不必要的循環(huán)引用。
    如果一個(gè)UITableViewController對(duì)象a通過(guò)retain獲取了UITableView對(duì)象b的所有權(quán),
    這個(gè)UITableView對(duì)象b的delegate又是a,如果這個(gè)delegate是retain方式的,
    那基本上就沒(méi)有機(jī)會(huì)釋放這兩個(gè)對(duì)象了。
    24. 什么時(shí)候用delegate,什么時(shí)候用Notification?
    Delegate(委托模式):
    1對(duì)1的反向消息通知功能。
    Notification(通知模式):
    只想要把消息發(fā)送出去,告知某些狀態(tài)的變化。但是并不關(guān)心誰(shuí)想要知道這個(gè)。
    25. 什么是KVC和KVO?
    KVC(Key-Value-Coding):鍵 - 值編碼是一種通過(guò)字符串間接訪問(wèn)對(duì)象的方式。
    而不是通過(guò)調(diào)用setter方法或通過(guò)實(shí)例變量訪問(wèn)的機(jī)制。很多情況下可以簡(jiǎn)化程序代碼。
    例如:
    @interface MeiLing:NSObject
    @property NSString *name;
    @property UILabel *label;
    @end
    對(duì)于name的賦值 可以使用 meiLing.name = @"笑玲"; 這是點(diǎn)語(yǔ)法。調(diào)用的是setName方法。
    KVC的寫(xiě)法是 [meiLing setValue:@"夢(mèng)玲" forKey:@"name"]; 通過(guò)name字符串賦值。
    當(dāng)然也可以跨層賦值,例如為label的text屬性賦值
    點(diǎn)語(yǔ)法: meiLing.label.text = @"笑玲";
    KVC: [meiLing setValue:@"夢(mèng)玲" forKeyPath:@"label.text"];
    KVO:鍵值觀察機(jī)制,他提供了觀察某一屬性變化的方法,極大的簡(jiǎn)化了代碼。
    KVO 只能被 KVC觸發(fā), 包括使用setValue:forKey:方法 和 點(diǎn)語(yǔ)法。
    通過(guò)下方方法為屬性添加KVO觀察
  • (void)addObserver:(NSObject *)observer
    forKeyPath:(NSString *)keyPath
    options:(NSKeyValueObservingOptions)options
    context:(nullable void *)context;
    當(dāng)被觀察的屬性發(fā)生變化時(shí),會(huì)自動(dòng)觸發(fā)下方方法
  • (void)observeValueForKeyPath:(NSString *)keyPath
    ofObject:(id)object
    change:(NSDictionary *)change
    context:(void *)context
    26. 設(shè)計(jì)模式是什么?你知道哪些設(shè)計(jì)模式,并簡(jiǎn)要敘述。
  • 單例模式:通過(guò)static關(guān)鍵詞,聲明全局變量。在整個(gè)進(jìn)程運(yùn)行期間只會(huì)被賦值一次。
  • 觀察者模式:KVO是典型的通知模式,觀察某個(gè)屬性的狀態(tài),狀態(tài)發(fā)生變化時(shí)通知觀察者。
  • 委托模式:代理+協(xié)議的組合。實(shí)現(xiàn)1對(duì)1的反相傳值操作。
  • 工廠模式:通過(guò)一個(gè)類(lèi)方法,批量的根據(jù)已有模板生產(chǎn)對(duì)象。
  • MVC模式:Model View Control, 把模型 視圖 控制器 層進(jìn)行解耦合編寫(xiě)。
  • MVVM模式:Model View ViewModel 把 模型 視圖 業(yè)務(wù)邏輯 層進(jìn)行解耦合編寫(xiě)。
    27. 描述一下iOS SDK中如何實(shí)現(xiàn)MVC的開(kāi)發(fā)模式。
    MVC即 Model-View-Control
    Model稱為模型層,主要負(fù)責(zé)數(shù)據(jù)結(jié)構(gòu),業(yè)務(wù)邏輯相關(guān)的操作
    View 稱為視圖層,主要負(fù)責(zé)視圖的展示
    Control 稱為控制層,主要負(fù)責(zé)把View和Model層結(jié)合起來(lái)的操作。例如點(diǎn)擊視圖上的某個(gè)按鈕
    要執(zhí)行Model層中的某個(gè)業(yè)務(wù)邏輯。 或者把Model中的數(shù)據(jù)展現(xiàn)在視圖上。
    28. ViewController的didReceiveMemoryWarning是在什么時(shí)候調(diào)用的?默認(rèn)的操作是什么?
    當(dāng)系統(tǒng)內(nèi)存不足時(shí),首先UIViewController的didReceiveMemoryWarining方法會(huì)被調(diào)用。
    默認(rèn)操作如果當(dāng)前控制器不是window的根視圖控制器,會(huì)自動(dòng)將self.view釋放。
    29. delegate和Block的區(qū)別?
    delegate:
  • 需要定義協(xié)議方法并且實(shí)現(xiàn)協(xié)議方法,會(huì)使代碼結(jié)構(gòu)變復(fù)雜
  • 效率沒(méi)有block高
    block:
  • 代碼結(jié)構(gòu)更加緊湊,不需要額外定義方法。
  • 需要注意防止循環(huán)引用,使用__weak 關(guān)鍵詞修飾
  • 當(dāng)需要在塊中修改外部變量時(shí),需要對(duì)外部變量使用__block 關(guān)鍵詞修飾
    30. frame和bounds有什么不同?
    frame指的是:該view在父view坐標(biāo)系統(tǒng)中的位置和大小。(參照點(diǎn)是父親的坐標(biāo)系統(tǒng))
    bounds指的是:該view在本身坐標(biāo)系統(tǒng)中 的位置和大小。(參照點(diǎn)是本身坐標(biāo)系統(tǒng))
    31.ViewController生命周期
    按照?qǐng)?zhí)行順序排列
  • initWithCoder:通過(guò)nib文件初始化時(shí)觸發(fā)
  • awakeFromNib:nib文件被加載的時(shí)候,會(huì)發(fā)送一個(gè)awakeFromNib的消息到nib文件中的每個(gè)對(duì)象
  • loadView:開(kāi)始加載視圖控制器自帶的view
  • viewDidLoad:視圖控制器的view被加載完成
  • viewWillAppear:視圖控制器的view將要顯示在window上
  • updateViewConstraints:視圖控制器的view開(kāi)始更新AutoLayout約束
  • viewWillLayoutSubviews:視圖控制器的view將要更新內(nèi)容視圖的位置
  • viewDidLayoutSubviews:視圖控制器的view已經(jīng)更新視圖的位置
  • viewDidAppear:視圖控制器的view已經(jīng)展現(xiàn)到window上
  • viewWillDisappear:視圖控制器的view將要從window上消失
  • viewDidDisappear:視圖控制器的view已經(jīng)從window上消失
    32. 如何將產(chǎn)品進(jìn)行多語(yǔ)言發(fā)布,開(kāi)發(fā)?
    國(guó)際化操作
    在Xcode中,Project里,找到Localization,點(diǎn)擊+號(hào),添加想要支持的語(yǔ)言
    通過(guò)新建Strings文件,把文件進(jìn)行國(guó)際化處理。 通過(guò)鍵值對(duì)的形式,同一個(gè)key在不同的國(guó)際化
    文件中,對(duì)應(yīng)不同的值。
    通過(guò) NSLocalizedStringFromTable 等方法,通過(guò)key來(lái)自動(dòng)根據(jù)iOS設(shè)備的當(dāng)前語(yǔ)言,
    顯示不同的字符串。
    33. OC中是如何實(shí)現(xiàn)線程同步的?
    @synchronized: 添加同步鎖
    NSLock:加鎖
    NSCondition:加條件鎖
    dispatch_async(dispatch_get_main_queue(), ^{}); :異步主線程
    NSOperationQueue:添加線程依賴
    NSOperationQueue:設(shè)置最大并發(fā)數(shù)為1
    34. UDP和TCP的區(qū)別是什么?
    1.基于連接與無(wú)連接;
    2.對(duì)系統(tǒng)資源的要求(TCP較多,UDP少);
    3.UDP程序結(jié)構(gòu)較簡(jiǎn)單;
    4.流模式與數(shù)據(jù)報(bào)模式 ;
    5.TCP保證數(shù)據(jù)正確性,UDP可能丟包,TCP保證數(shù)據(jù)順序,UDP不保證
    35. TCP/IP建立連接的過(guò)程?
  • 在TCP/IP 協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立連接;
  • 第一次握手:建立連接時(shí),客戶端發(fā)送連接請(qǐng)求到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
  • 第二次握手:服務(wù)器收到客戶端連接請(qǐng)求,向客戶端發(fā)送允許連接應(yīng)答,
    此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
  • 第三次握手:客戶端收到服務(wù)器的允許連接應(yīng)答,向服務(wù)器發(fā)送確認(rèn),客戶端和服務(wù)器進(jìn)入通信狀態(tài),
    完成三次握手。
    (所謂的三次握手,就是要有三次連接信息的發(fā)送、接收過(guò)程。
    TCP連的建立需要進(jìn)行三次連接信息的發(fā)送、接收。)
    36. 編程中,保存數(shù)據(jù)有哪幾種方式?
  • 數(shù)據(jù):Sqlite。 操作方式分為原生的sqlite3,F(xiàn)MDB,Coredata
  • 歸檔:Archive。 自定義類(lèi)型需要注意遵循NSCoding協(xié)議
  • Plist:就是數(shù)組或字典,寫(xiě)入文件后的表現(xiàn)形式。
  • NSUserDefault:本質(zhì)上就是Plist。
  • 寫(xiě)文件
  • 上傳到服務(wù)器
    37. 介紹版本控制中Git與SVN。
    1、Git是一款免費(fèi)、開(kāi)源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或小或大的項(xiàng)目。
    主要區(qū)別于SVN工具的功能是 分支功能比SVN強(qiáng)大。 (常用)
    2、SVN是Subversion的簡(jiǎn)稱,是一個(gè)開(kāi)放源代碼的版本控制系統(tǒng),它采用了分支管理系統(tǒng),
    它的設(shè)計(jì)目標(biāo)就是取代CVS。
    38. OC中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時(shí)執(zhí)行代碼,方法又是什么?
    創(chuàng)建線程的方法
  • [NSThread detachNewThreadSelector:nil toTarget:nil withObject:nil]
  • [self performSelectorInBackground:nil withObject:nil];
  • [[NSThread alloc] initWithTarget:nil selector:nil object:nil];
  • dispatch_async(dispatch_get_global_queue(0, 0), ^{});
  • [[NSOperationQueue new] addOperation:nil];
    主線程中執(zhí)行代碼的方法
  • [self performSelectorOnMainThread:nil withObject:nil waitUntilDone:YES]
  • dispatch_async(dispatch_get_main_queue(), ^{});
  • [[NSOperationQueue mainQueue] addOperation:nil];
    延遲執(zhí)行代碼
    sleep(2) 睡兩秒鐘
    NSTimer啟動(dòng)定時(shí)器
    39. iOS中有哪些多線程方案?
    常用的有三種: NSThread NSOperationQueue GCD。
    1、NSThread 是這三種范式里面相對(duì)輕量級(jí)的,但也是使用起來(lái)最負(fù)責(zé)的,
    你需要自己管理thread的生命周期,線程之間的同步。線程共享同一應(yīng)用程序的部分內(nèi)存空間,
    它們擁有對(duì)數(shù)據(jù)相同的訪問(wèn)權(quán)限。你得協(xié)調(diào)多個(gè)線程對(duì)同一數(shù)據(jù)的訪問(wèn),
    一般做法是在訪問(wèn)之前加鎖,這會(huì)導(dǎo)致一定的性能開(kāi)銷(xiāo)。
    2、NSOperationQueue 以面向?qū)ο蟮姆绞椒庋b了用戶需要執(zhí)行的操作,
    我們只要聚焦于我們需要做的事情,而不必太操心線程的管理,同步等事情,
    因?yàn)镹SOperation已經(jīng)為我們封裝了這些事情。
    NSOperation 是一個(gè)抽象基類(lèi),我們必須使用它的子類(lèi)。
    3、 GCD: iOS4 才開(kāi)始支持,它提供了一些新的特性,以及運(yùn)行庫(kù)來(lái)支持多核并行編程,
    它的關(guān)注點(diǎn)更高:如何在多個(gè)cpu上提升效率。
    總結(jié):
  • NSThread是早期的多線程解決方案,實(shí)際上是把C語(yǔ)言的PThread線程管理代碼封裝成OC代碼。
  • GCD是取代NSThread的多線程技術(shù),C語(yǔ)法+block。功能強(qiáng)大。
  • NSOperationQueue是把GCD封裝為OC語(yǔ)法,額外比GCD增加了幾項(xiàng)新功能。
  • 最大線程并發(fā)數(shù)
  • 取消隊(duì)列中的任務(wù)
  • 暫停隊(duì)列中的任務(wù)
  • 可以調(diào)整隊(duì)列中的任務(wù)執(zhí)行順序,通過(guò)優(yōu)先級(jí)
  • 線程依賴
  • NSOperationQueue支持KVO。 這就意味著你可以觀察任務(wù)的狀態(tài)屬性。
    但是NSOperationQueue的執(zhí)行效率沒(méi)有GCD高,所以一半情況下,我們使用GCD來(lái)完成多線程操作。
    40. 線程與進(jìn)程的區(qū)別和聯(lián)系?
    1.什么是進(jìn)程
    進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序
    每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專(zhuān)用且受保護(hù)的內(nèi)存空間內(nèi)
    2.什么是線程
    1個(gè)進(jìn)程要想執(zhí)行任務(wù),必須得有線程(每1個(gè)進(jìn)程至少要有1條線程)
    線程是進(jìn)程的基本執(zhí)行單元,一個(gè)進(jìn)程(程序)的所有任務(wù)都在線程中執(zhí)行。
    MRC:手動(dòng)內(nèi)存釋放。遵循誰(shuí)申請(qǐng)誰(shuí)釋放的原則,需要手動(dòng)的處理內(nèi)存計(jì)數(shù)的增加和修改。從12年開(kāi)始,逐步被ARC(自動(dòng)內(nèi)存釋放)模式取代。
    點(diǎn)語(yǔ)法: “self.屬性 = obj” 調(diào)用屬性的setter方法?!眘elf.屬性” 調(diào)用屬性的getter方法區(qū)別在于是否有等號(hào)。

41.Provider是指某個(gè)iPhone軟件的Push服務(wù)器,這篇文章我將使用.net作為Provider。
APNS 是Apple Push Notification Service(Apple Push服務(wù)器)的縮寫(xiě),是蘋(píng)果的服務(wù)器。
上圖可以分為三個(gè)階段。
第一階段:.net應(yīng)用程序把要發(fā)送的消息、目的iPhone的標(biāo)識(shí)打包,發(fā)給APNS。
第二階段:APNS在自身的已注冊(cè)Push服務(wù)的iPhone列表中,查找有相應(yīng)標(biāo)識(shí)的iPhone,并把消息發(fā)到iPhone。
第三階段:iPhone把發(fā)來(lái)的消息傳遞給相應(yīng)的應(yīng)用程序,并且按照設(shè)定彈出Push通知。
http://blog.csdn.net/zhuqilin0/article/details/6527113 //消息推送機(jī)制
看內(nèi)存泄露時(shí)候:在搜索中搜索run 找到Run Static Analyzer .

42.ASIDownloadCache 設(shè)置下載緩存
它對(duì)Get請(qǐng)求的響應(yīng)數(shù)據(jù)進(jìn)行緩存(被緩存的數(shù)據(jù)必需是成功的200請(qǐng)求):
[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];
當(dāng)設(shè)置緩存策略后,所有的請(qǐng)求都被自動(dòng)的緩存起來(lái)。
另外,如果僅僅希望某次請(qǐng)求使用緩存操作,也可以這樣使用:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadCache:[ASIDownloadCache sharedCache]];
緩存存儲(chǔ)方式
你可以設(shè)置緩存的數(shù)據(jù)需要保存多長(zhǎng)時(shí)間,ASIHTTPRequest提供了兩種策略:
a,ASICacheForSessionDurationCacheStoragePolicy,默認(rèn)策略,基于session的緩存數(shù)據(jù)存儲(chǔ)。當(dāng)下次運(yùn)行或[ASIHTTPRequest clearSession]時(shí),緩存將失效。
b,ASICachePermanentlyCacheStoragePolicy,把緩存數(shù)據(jù)永久保存在本地,
如:
ASIHTTPRequest *request = [ ASIHTTPRequest requestWithURL:url ];
[ request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy ];
43.HTTP協(xié)議詳解
HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡(jiǎn)捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規(guī)范化工作正在進(jìn)行之中。
http(超文本傳輸協(xié)議)是一個(gè)基于請(qǐng)求與響應(yīng)模式的、無(wú)狀態(tài)的、應(yīng)用層的協(xié)議,常基于TCP的連接方式,HTTP1.1版本中給出一種持續(xù)連接的機(jī)制,絕大多數(shù)的Web開(kāi)發(fā),都是構(gòu)建在HTTP協(xié)議之上的Web應(yīng)用。
HTTP協(xié)議的主要特點(diǎn)可概括如下:
1.支持客戶/服務(wù)器模式。
2.簡(jiǎn)單快速:客戶向服務(wù)器請(qǐng)求服務(wù)時(shí),只需傳送請(qǐng)求方法和路徑。請(qǐng)求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類(lèi)型不同。由于HTTP協(xié)議簡(jiǎn)單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。
3.靈活:HTTP允許傳輸任意類(lèi)型的數(shù)據(jù)對(duì)象。正在傳輸?shù)念?lèi)型由Content-Type加以標(biāo)記。
4.無(wú)連接:無(wú)連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開(kāi)連接。采用這種方式可以節(jié)省傳輸時(shí)間。
5.無(wú)狀態(tài):HTTP協(xié)議是無(wú)狀態(tài)協(xié)議。無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。
44.URL
HTTP URL (URL是一種特殊類(lèi)型的URI是他的子類(lèi),包含了用于查找某個(gè)資源的足夠的信息)的格式如下:
http://host[":"port][abs_path]
http表示要通過(guò)HTTP協(xié)議來(lái)定位網(wǎng)絡(luò)資源;host表示合法的Internet主機(jī)域名或者IP地址;port指定一個(gè)端口號(hào),為空則使用缺省端口80;abs_path指定請(qǐng)求資源的URI;如果URL中沒(méi)有給出abs_path,那么當(dāng)它作為請(qǐng)求URI時(shí),必須以“/”的形式給出,通常這個(gè)工作瀏覽器自動(dòng)幫我們完成。
45.TCP/UDP區(qū)別聯(lián)系
TCP---傳輸控制協(xié)議,提供的是面向連接、可靠的字節(jié)流服務(wù)。當(dāng)客戶和服務(wù)器彼此交換數(shù)據(jù)前,必須先在雙方之間建立一個(gè)TCP連接,之后才能傳輸數(shù)據(jù)。TCP提供超時(shí)重發(fā),丟棄重復(fù)數(shù)據(jù),檢驗(yàn)數(shù)據(jù),流量控制等功能,保證數(shù)據(jù)能從一端傳到另一端。
UDP---用戶數(shù)據(jù)報(bào)協(xié)議,是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)報(bào)的運(yùn)輸層協(xié)議。UDP不提供可靠性,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去,但是并不能保證它們能到達(dá)目的地。由于UDP在傳輸數(shù)據(jù)報(bào)前不用在客戶和服務(wù)器之間建立一個(gè)連接,且沒(méi)有超時(shí)重發(fā)等機(jī)制,故而傳輸速度很快
TCP(Transmission Control Protocol,傳輸控制協(xié)議)是基于連接的協(xié)議,也就是說(shuō),在正式收發(fā)數(shù)據(jù)前,必須和對(duì)方建立可靠的連接。一個(gè)TCP連接必須要經(jīng)過(guò)三次“對(duì)話”才能建立起來(lái),我們來(lái)看看這三次對(duì)話的簡(jiǎn)單過(guò)程:1.主機(jī)A向主機(jī)B發(fā)出連接請(qǐng)求數(shù)據(jù)包;2.主機(jī)B向主機(jī)A發(fā)送同意連接和要求同步(同步就是兩臺(tái)主機(jī)一個(gè)在發(fā)送,一個(gè)在接收,協(xié)調(diào)工作)的數(shù)據(jù)包;3.主機(jī)A再發(fā)出一個(gè)數(shù)據(jù)包確認(rèn)主機(jī)B的要求同步:“我現(xiàn)在就發(fā),你接著吧!”,這是第三次對(duì)話。三次“對(duì)話”的目的是使數(shù)據(jù)包的發(fā)送和接收同步,經(jīng)過(guò)三次“對(duì)話”之后,主機(jī)A才向主機(jī)B正式發(fā)送數(shù)據(jù)。
UDP(User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是與TCP相對(duì)應(yīng)的協(xié)議。它是面向非連接的協(xié)議,它不與對(duì)方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過(guò)去! UDP適用于一次只傳送少量數(shù)據(jù)、對(duì)可靠性要求不高的應(yīng)用環(huán)境。
tcp協(xié)議和udp協(xié)議的差別
是否連接面向連接面向非連接
傳輸可靠性可靠不可靠
應(yīng)用場(chǎng)合傳輸大量數(shù)據(jù)少量數(shù)據(jù)
速度慢快
46.socket連接和http連接的區(qū)別
簡(jiǎn)單說(shuō),你瀏覽的網(wǎng)頁(yè)(網(wǎng)址以http://開(kāi)頭)都是http協(xié)議傳輸?shù)侥愕臑g覽器的, 而http是基于socket之上的。socket是一套完成tcp,udp協(xié)議的接口。
HTTP協(xié)議:簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議,對(duì)應(yīng)于應(yīng)用層 ,HTTP協(xié)議是基于TCP連接的
tcp協(xié)議: 對(duì)應(yīng)于傳輸層
ip協(xié)議: 對(duì)應(yīng)于網(wǎng)絡(luò)層
TCP/IP是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸;而HTTP是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)。
Socket是對(duì)TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API),通過(guò)Socket,我們才能使用TCP/IP協(xié)議。
http連接:http連接就是所謂的短連接,即客戶端向服務(wù)器端發(fā)送一次請(qǐng)求,服務(wù)器端響應(yīng)后連接即會(huì)斷掉;
socket連接:socket連接就是所謂的長(zhǎng)連接,理論上客戶端和服務(wù)器端一旦建立起連接將不會(huì)主動(dòng)斷掉;但是由于各種環(huán)境因素可能會(huì)是連接斷開(kāi),比如說(shuō):服務(wù)器端或客戶端主機(jī)down了,網(wǎng)絡(luò)故障,或者兩者之間長(zhǎng)時(shí)間沒(méi)有數(shù)據(jù)傳輸,網(wǎng)絡(luò)防火墻可能會(huì)斷開(kāi)該連接以釋放網(wǎng)絡(luò)資源。所以當(dāng)一個(gè)socket連接中沒(méi)有數(shù)據(jù)的傳輸,那么為了維持連接需要發(fā)送心跳消息~~具體心跳消息格式是開(kāi)發(fā)者自己定義的
我們已經(jīng)知道網(wǎng)絡(luò)中的進(jìn)程是通過(guò)socket來(lái)通信的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲學(xué)之一就是“一切皆文件”,都可以用“打開(kāi)open –> 讀寫(xiě)write/read –> 關(guān)閉close”模式來(lái)操作。我的理解就是Socket就是該模式的一個(gè)實(shí)現(xiàn),socket即是一種特殊的文件,一些socket函數(shù)就是對(duì)其進(jìn)行的操作(讀/寫(xiě)IO、打開(kāi)、關(guān)閉),這些函數(shù)我們?cè)诤竺孢M(jìn)行介紹。我們?cè)趥鬏敂?shù)據(jù)時(shí),可以只使用(傳輸層)TCP/IP協(xié)議,但是那樣的話,如果沒(méi)有應(yīng)用層,便無(wú)法識(shí)別數(shù)據(jù)內(nèi)容,如果想要使傳輸?shù)臄?shù)據(jù)有意義,則必須使用到應(yīng)用層協(xié)議,應(yīng)用層協(xié)議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應(yīng)用層協(xié)議。WEB使用HTTP協(xié)議作應(yīng)用層協(xié)議,以封裝HTTP文本信息,然后使用TCP/IP做傳輸層協(xié)議將它發(fā)到網(wǎng)絡(luò)上。
1)Socket是一個(gè)針對(duì)TCP和UDP編程的接口,你可以借助它建立TCP連接等等。而TCP和UDP協(xié)議屬于傳輸層 。
而http是個(gè)應(yīng)用層的協(xié)議,它實(shí)際上也建立在TCP協(xié)議之上。
(HTTP是轎車(chē),提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力。)
2)Socket是對(duì)TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API),通過(guò)Socket,我們才能使用TCP/IP協(xié)議。Socket的出現(xiàn)只是使得程序員更方便地使用TCP/IP協(xié)議棧而已,是對(duì)TCP/IP協(xié)議的抽象,從而形成了我們知道的一些最基本的函數(shù)接口。
47.什么是TCP連接的三次握手
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。
握手過(guò)程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務(wù)器才正式開(kāi)始傳送數(shù)據(jù)。理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主動(dòng)關(guān)閉連接之前,TCP 連接都將被一直保持下去。斷開(kāi)連接時(shí)服務(wù)器和客戶端均可以主動(dòng)發(fā)起斷開(kāi)TCP連接的請(qǐng)求,斷開(kāi)過(guò)程需要經(jīng)過(guò)“四次握手”(過(guò)程就不細(xì)寫(xiě)了,就是服務(wù)器和客戶端交互,最終確定斷開(kāi))
48.利用Socket建立網(wǎng)絡(luò)連接的步驟
建立Socket連接至少需要一對(duì)套接字,其中一個(gè)運(yùn)行于客戶端,稱為ClientSocket ,另一個(gè)運(yùn)行于服務(wù)器端,稱為ServerSocket 。
套接字之間的連接過(guò)程分為三個(gè)步驟:服務(wù)器監(jiān)聽(tīng),客戶端請(qǐng)求,連接確認(rèn)。
1。服務(wù)器監(jiān)聽(tīng):服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài),等待客戶端的連接請(qǐng)求。
2??蛻舳苏?qǐng)求:指客戶端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端套接字提出連接請(qǐng)求。
3。連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽(tīng)到或者說(shuō)接收到客戶端套接字的連接請(qǐng)求時(shí),就響應(yīng)客戶端套接字的請(qǐng)求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,雙方就正式建立連接。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽(tīng)狀態(tài),繼續(xù)接收其他客戶端套接字的連接請(qǐng)求。

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

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

  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛(ài)閱讀 2,251評(píng)論 0 7
  • 多線程、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景。SDWebImage的原...
    LZM輪回閱讀 2,124評(píng)論 0 12
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,575評(píng)論 0 35
  • 1、OC中創(chuàng)建線程的方法是什么?如果指定在主線程中執(zhí)行代碼?如何延時(shí)執(zhí)行代碼?!倦y度系數(shù)★★】 1)創(chuàng)建線程的方法...
    木旁_G閱讀 2,087評(píng)論 2 16
  • 參考文章: Xcode Project File Format 打開(kāi)project.pbxproj,基本結(jié)構(gòu)如下 ...
    觀星閱讀 2,066評(píng)論 0 0

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