中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

iOS的那些面試

2018-07-20    來(lái)源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

筆試面試是程序員應(yīng)聘繞不過(guò)的坎,想進(jìn)大廠就一定要有知識(shí)儲(chǔ)備量,而這個(gè)卻是最佳的考察方式。筆者分享一些收集的iOS面試題,答案僅供參考,如有錯(cuò)誤,還請(qǐng)指正。

第一部分

1.Objective-C語(yǔ)言的基本特點(diǎn)?

Objective-C語(yǔ)言是C語(yǔ)言的一個(gè)超集,只是在C的基礎(chǔ)之上添加了面向?qū)ο螅∣O)的特性;Objective-C與Java語(yǔ)言相同都是單繼承,這一點(diǎn)與C++語(yǔ)言不同(多重繼承),這一點(diǎn)可以參看之前有關(guān)講解繼承的文章;Objective-C不支持命名空間,取而代之的是在類名之前添加前綴,以此來(lái)區(qū)分。

2.#include與#import的區(qū)別,#import與@class的區(qū)別?

1)#include和#import效果相同,只是后者不會(huì)引起交叉編譯,確保頭文件只會(huì)被導(dǎo)入一次。

2)#import會(huì)包含這個(gè)類的所有信息,包括實(shí)體變量和方法,而@class只是告訴編譯器,其后面聲明的名稱是類的名稱,至于這些類是如何定義的,暫時(shí)不用考慮,后面會(huì)再告訴你。使用#import編譯效率高,防止相互包含的編譯錯(cuò)誤。

3.簡(jiǎn)述類目?jī)?yōu)缺點(diǎn),如果覆蓋本類或者父類的方法會(huì)出現(xiàn)什么問(wèn)題?

優(yōu)點(diǎn):不需要通過(guò)增加子類而增加現(xiàn)有類的行為(方法),且類目中的方法與原始類方法基本沒(méi)有區(qū)別。

缺點(diǎn):無(wú)法向類目添加實(shí)例變量。覆蓋原始類方法后,原始類的方法沒(méi)辦法調(diào)用。

4.簡(jiǎn)述內(nèi)存管理基本原則?

如果使用alloc、copy(mutableCopy)或者retain一個(gè)對(duì)象時(shí),你就有義務(wù)向它發(fā)送一條release或autorelease消息。其他方法創(chuàng)建的對(duì)象,不需要由你來(lái)管理內(nèi)存。

5.什么是ARC技術(shù)?與GC是否相同?

ARC是Automatic Reference Counting的簡(jiǎn)稱,我們稱之為自動(dòng)引用計(jì)數(shù),是iOS5.0之后推出的內(nèi)存管理的新特性。本質(zhì)上還是使用引用計(jì)數(shù)來(lái)管理對(duì)象,只是我們?cè)诰帉?xiě)代碼時(shí),不需要向?qū)ο蟀l(fā)送release或autorelease方法,也不可以調(diào)用dealloc方法,編譯器會(huì)在合適的位置自動(dòng)給用戶生成release(autorelease)消息。GC是Garbage Collection,內(nèi)存垃圾回收機(jī)制,ARC比GC性能好。

6.iOS中是否支持垃圾回收機(jī)制?

iOS開(kāi)發(fā)只支持MRC與ARC,Mac開(kāi)發(fā)支持GC垃圾回收機(jī)制,10.8之后棄用了GC,推薦使用ARC。

7.深、淺復(fù)制的基本概念以及區(qū)別?

淺復(fù)制:只復(fù)制對(duì)象本身,不對(duì)里面的屬性復(fù)制。

深復(fù)制:不僅復(fù)制對(duì)象本身,對(duì)象持有的屬性對(duì)象也做復(fù)制。

8.內(nèi)存中的堆區(qū)和棧區(qū)的差別?

棧區(qū)(stack)由編譯器自動(dòng)分配釋放,存放方法(函數(shù))的參數(shù)值,局部變量的值等。

堆區(qū)(heap)一般由程序員分配與釋放,若程序員不釋放,則會(huì)內(nèi)存溢出。

9.用戶自定義了一個(gè)對(duì)象,如何實(shí)現(xiàn)拷貝(可變和不可變拷貝)?

必須實(shí)現(xiàn)copying和mutableCopying協(xié)議,表示返回一個(gè)不可變和可變的對(duì)象。否則,程序?qū)?huì)出現(xiàn)異常。

-(id)copyWithZone:(NSZone *)zone {
	Person *person = [[self Class] allocWithZone:zone];
	person->age = self.age;
	person->name = self.name;
	return person;
}
-(id)mutableCopyWithZone:(NSZone *)zone;

10.定義屬性時(shí),什么時(shí)候用assign、retain、copy和nonatomic?

assign:普通賦值,一般常用于基本數(shù)據(jù)類型,常見(jiàn)委托設(shè)計(jì)模式,以此來(lái)防止循環(huán)引用。

retain:保留計(jì)數(shù),獲得了對(duì)象的所有權(quán)。引用計(jì)數(shù)在原有基礎(chǔ)上加1。

copy:用來(lái)復(fù)制對(duì)象,一般字符串使用,F(xiàn)oundation中的不可變對(duì)象使用,效果相當(dāng)于retain,只是引用計(jì)數(shù)加1。

nonatomic:非原子性訪問(wèn),不加同步,多線程并發(fā)訪問(wèn)會(huì)提高性能。

11.strong和weak,_unsafe_unretained與weak的區(qū)別?

strong:強(qiáng)引用,在ARC中告訴編譯器幫助我們自動(dòng)插入retain。

weak:弱引用,是普通賦值,相當(dāng)于手動(dòng)管理內(nèi)存的assign。

_unsafe_unretained:與weak功能一致,區(qū)別在于當(dāng)指向的對(duì)象銷毀后,weak會(huì)將變量置為nil,防止調(diào)用野指針。

12.ARC存在內(nèi)存泄露嗎?

ARC中如果內(nèi)存管理不當(dāng)?shù)脑,同樣?huì)存在內(nèi)存泄露。例如,ARC中也會(huì)循環(huán)引用導(dǎo)致內(nèi)存泄露;Objective-C對(duì)象與CoreFoundation類之間橋接時(shí),管理不當(dāng)也會(huì)產(chǎn)生內(nèi)存泄露。

13.當(dāng)我們釋放對(duì)象時(shí),為什么需要調(diào)用[super dealloc]方法?

子類是繼承自父類,那么子類中有一些實(shí)例變量(對(duì)象),是繼承自父類的,因此,我們需要調(diào)用父類方法,將父類所擁有的實(shí)例進(jìn)行釋放。

14.自動(dòng)釋放池是什么,如何工作?

自動(dòng)釋放池是NSAutorelease類的一個(gè)實(shí)例,當(dāng)向一個(gè)對(duì)象發(fā)送autorelease消息時(shí),該對(duì)象會(huì)自動(dòng)入池,待池銷毀時(shí),將會(huì)向池中所有對(duì)象發(fā)送一條release消息,釋放對(duì)象。

15.為什么delegate(代理)屬性都是assign而不是retain的?

防止循環(huán)引用,以至對(duì)象無(wú)法得到正確的釋放。

第二部分

1.iOS開(kāi)發(fā)中數(shù)據(jù)持久性有哪幾種?

plist文件寫(xiě)入,對(duì)象歸檔,sqlite3數(shù)據(jù)庫(kù),CoreData。

2.什么是KVC和KVO?它們之間的關(guān)系是什么?

KVC:鍵值編碼,是一種間接訪問(wèn)對(duì)象實(shí)例變量的機(jī)制,該機(jī)制可以不通過(guò)存取方法就可以訪問(wèn)對(duì)象的實(shí)例變量。

KVO:鍵值觀察,是一種能使得對(duì)象獲取到其他對(duì)象屬性變化的通知機(jī)制。

實(shí)現(xiàn)KVO鍵值觀察模式,被觀察的對(duì)象必須使用KVC鍵值編碼來(lái)修改它的實(shí)例變量,這樣才能被觀察者觀察到。因此,KVC是KVO的基礎(chǔ)或者說(shuō)KVO的實(shí)現(xiàn)是建立在KVC的基礎(chǔ)之上的。

3.簡(jiǎn)述常見(jiàn)的設(shè)計(jì)模式?

單例模式、代理設(shè)計(jì)、觀察者(通知)、工廠方法、模板方法。

4.內(nèi)存管理在dealloc方法中用release方法與self.xx=nil哪個(gè)好?

使用self.xx=nil更好,因?yàn)橄日{(diào)用了release方法,而且還將變量設(shè)置為nil,這樣就更安全的釋放對(duì)象,防止野指針調(diào)用。

5.線程與進(jìn)程的區(qū)別和聯(lián)系?

一般的應(yīng)用程序是單個(gè)進(jìn)程,也有多進(jìn)程(Chrome),進(jìn)程是個(gè)靜態(tài)的容器,里面容納了很多個(gè)線程,線程是一系列方法的線性執(zhí)行路徑。

6.Objective-C語(yǔ)言的優(yōu)缺點(diǎn)?

優(yōu)點(diǎn):類目、動(dòng)態(tài)識(shí)別、支持C語(yǔ)言、Objective-C與C++可以混編。

缺點(diǎn):不支持命名空間、不支持運(yùn)算符重載、不支持多重繼承。

7.代理delegate、通知Notification與block的使用區(qū)別?

delegate和block一般是用于兩個(gè)對(duì)象一對(duì)一之間的通信交互,delegate需要定義協(xié)議方法,代理對(duì)象實(shí)現(xiàn)協(xié)議方法,并且需要建立代理關(guān)系才可以實(shí)現(xiàn)通信。block更加簡(jiǎn)潔,不需要定義繁瑣的協(xié)議方法,但是如果通信事件比較多的話,建議使用delegate。

Notification主要用于一對(duì)多情況下通信,而且,通信對(duì)象之間不需要建立關(guān)系,但是使用通知,代碼可讀性差。

8.控制器ViewController的loadView、viewDidLoad、viewWillApear和viewDidUnload分別是在什么時(shí)候調(diào)用?

loadView:當(dāng)控制器的根視圖view為空,且此view被訪問(wèn)時(shí)調(diào)用。

viewDidLoad:loadView調(diào)用之后被調(diào)用。

viewWillApear:當(dāng)控制器根視圖view被添加到父視圖上時(shí)調(diào)用。

viewDidUnload:iOS6.0之前,當(dāng)內(nèi)存警告時(shí),先卸載視圖,再調(diào)用

viewDidUnload來(lái)釋放內(nèi)存。

[email protected]和@dynamic的區(qū)別?

@synthesize:系統(tǒng)自動(dòng)生成getter和setter屬性聲明。

@dynamic:告訴編譯器,屬性的獲取與賦值方法由用戶自己實(shí)現(xiàn),不自動(dòng)生成。

10.事件響應(yīng)者鏈的概念?

響應(yīng)者鏈表示一系列的響應(yīng)者對(duì)象。事件被交由第一響應(yīng)者對(duì)象處理,如果第一響應(yīng)者不處理,事件被沿著響應(yīng)者鏈向上傳遞,交給下一個(gè)響應(yīng)者。一般來(lái)說(shuō),第一響應(yīng)者是個(gè)視圖對(duì)象或者其子類對(duì)象,當(dāng)其被觸摸后事件交由它處理,如果它不處理,事件會(huì)被傳遞給它的視圖控制器對(duì)象(如果存在),然后是它的父視圖對(duì)象(如果存在),以此類推,直到頂層視圖。接下來(lái)會(huì)沿著頂層視圖到窗口(UIWindow對(duì)象),再到程序(UIApplication對(duì)象)。如果整個(gè)過(guò)程都沒(méi)有響應(yīng)這個(gè)事件,該事件被丟棄。一般情況下,在響應(yīng)者鏈中只要有對(duì)象處理事件,事件就停止傳遞。但有時(shí)候可以在視圖的響應(yīng)方法中根據(jù)一些條件判斷來(lái)決定是否需要繼續(xù)傳遞事件。

11.C語(yǔ)言中的static變量和static函數(shù)有什么作用?

1)表示變量是靜態(tài)存儲(chǔ)變量,表示變量存放在靜態(tài)存儲(chǔ)區(qū)。

2)加在函數(shù)前面的時(shí)候表示該函數(shù)是內(nèi)部連接,只在本文件中有效,別的文件中不能使用該函數(shù)。

12.指針題

1)int a; //一個(gè)數(shù)值。
2)int *a; //一個(gè)指向數(shù)值的指針。
3)int **a; //一個(gè)指向指針的指針。
4)int a[10]; //一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的。
5)int *a[10]; //一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的。
6)int (*a)[10]; //一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針。
7)int (*a)(int); //一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)。
8)int (*a[10])(int); //一個(gè)有10個(gè)指針的數(shù)組,該指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)。

13.寫(xiě)一個(gè)NSString類的實(shí)現(xiàn)?

+(id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding {
	NSString *obj;
	obj = [self allocWithZone:NSDefaultMallocZone()];
	obj = [obj initWithCString:nullTerminatedCString encoding:encoding];
	return autorelease(obj);
}

14.Objective-C與C如何混用?Objective-C與C++如何混用?

實(shí)現(xiàn)文件的擴(kuò)展名.m改成.mm即可,但cpp文件必須只能使用C/C++代碼,而且cpp文件include的頭文件中,也不能出現(xiàn)Objective-C的代碼,因?yàn)閏pp只能寫(xiě)C++的代碼。

15.Objective-C中有私有方法和私有變量嗎?

使用private修飾的全局變量是私有的變量。

Objective-C在語(yǔ)法上沒(méi)有設(shè)計(jì)私有的方法,不過(guò)可以通過(guò)延展在實(shí)現(xiàn)文件里定義方法作為私有的方法。但不是真正意義上的私有方法,也是可以調(diào)用的,只是外部不可見(jiàn)而已。

第三部分

1.下面關(guān)鍵字const有什么含義?

const int a;
int const a;
const int *a;
int * const a;

前兩個(gè)的作用是一樣的,a是一個(gè)常整型數(shù)。

第三個(gè)意味著a是一個(gè)指向常整型數(shù)的指針(即整型數(shù)是不可修改的,但指針可以)。

第四個(gè)意味著a是一個(gè)指向整型數(shù)的常指針(即指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。

2.C語(yǔ)言中extern的作用,extern “C”的作用?

1)extern可以置于變量或者函數(shù)前,以標(biāo)示變量或函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時(shí)在其他模塊中尋找其定義。

2)C++語(yǔ)言在編譯的時(shí)候?yàn)榱私鉀Q函數(shù)的多態(tài)問(wèn)題,會(huì)將函數(shù)名和參數(shù)聯(lián)合起來(lái)生成一個(gè)中間的函數(shù)名稱,而C語(yǔ)言則不會(huì),因此會(huì)造成鏈接時(shí)找不到對(duì)應(yīng)函數(shù)的情況,此時(shí)C函數(shù)就需要用extern “C”進(jìn)行鏈接指定,這告訴編譯器,請(qǐng)保持我的名稱,不要給我生成用于鏈接的中間函數(shù)名。

3.Objective-C是如何管理內(nèi)存的?

Objective-C語(yǔ)言是使用引用計(jì)數(shù)來(lái)管理一個(gè)對(duì)象的生命周期,當(dāng)對(duì)象被其他“人”使用的時(shí)候引用計(jì)數(shù)加1,不使用時(shí)減1,當(dāng)此對(duì)象的引用計(jì)數(shù)為0時(shí),則對(duì)象被系統(tǒng)回收。

4.什么是動(dòng)態(tài)綁定(多態(tài))?

動(dòng)態(tài)綁定是面向?qū)ο筇匦灾欢鄳B(tài)的體現(xiàn),聲明一個(gè)變量,在運(yùn)行的時(shí)候可以綁定不同的對(duì)象,比如在方法的參數(shù)中聲明這樣一個(gè)變量UIView *view,運(yùn)行的時(shí)候,我們可以根據(jù)不同的應(yīng)用場(chǎng)景給view變量傳入不同的對(duì)象,可以傳遞一個(gè)UIButton對(duì)象,也可以傳入U(xiǎn)IImageView對(duì)象。

5.如何理解delegate?

delegate,又稱為委托或代理,它是一種設(shè)計(jì)模式。delegate主要用于兩個(gè)對(duì)象之間的通信交互,并且解除兩個(gè)通信對(duì)象的耦合性,iOS中大量使用了delegate設(shè)計(jì),主要用于視圖與使用對(duì)象之間的通信交互。

6.block與函數(shù)有何異同?block有何優(yōu)點(diǎn)?

1)block類似于C里面的函數(shù)指針,都可以作為參數(shù)進(jìn)行傳遞,用于回調(diào)。但是block的實(shí)現(xiàn)可以定義在方法中,函數(shù)則不可以。

2)block語(yǔ)法簡(jiǎn)潔,可以在方法中定義實(shí)現(xiàn),這樣可以訪問(wèn)方法中的局部變量,使代碼更加的緊湊,結(jié)構(gòu)化。

7.為什么標(biāo)準(zhǔn)頭文件都有類似以下的結(jié)構(gòu)?

#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}
#endif
#endif /*__INCvxWorksh*/

顯然,頭文件中的編譯宏“#ifndef INCvxWorksh、#define INCvxWorksh、#endif”的作用是防止該頭文件被重復(fù)引用。

8.CocoaTouch框架?

UIKit、Foundation、CoreGraphic、CoreAnimation

1)音頻和視頻:Core Audio、OpenAL、Media Library、AV Foundation

2)數(shù)據(jù)管理:Core Data、SQLite

3)圖形和動(dòng)畫(huà):Core Animation、OpenGL ES、Quartz 2D、Core Graphic

4)用戶應(yīng)用:Address Book、Core Location、Map Kit、Store Kit

9.棧結(jié)構(gòu)與隊(duì)列的區(qū)別?

棧(stack):限定只能在表的一端進(jìn)行插入和刪除操作的線性表。

隊(duì)列(queue):限定只能在表的一端插入和在另一端進(jìn)行刪除操作的線性表。

1)隊(duì)列先進(jìn)先出,棧先進(jìn)后出。

2)對(duì)插入和刪除操作的“限定”不同。

3)遍歷數(shù)據(jù)速度不同。隊(duì)列遍歷數(shù)據(jù)的速度要快得多。

10.Objective-C中有無(wú)多重繼承?如何實(shí)現(xiàn)多重繼承?

Objective-C是沒(méi)有多重繼承的。

Cocoa中所有的類都是NSObject的子類,多繼承在這里是用protocol委托代理來(lái)實(shí)現(xiàn)的。

面向?qū)ο笳Z(yǔ)言大部分都是單繼承,例如:Java、C#。

C++支持多繼承。

11.static全局變量與普通的全局變量的區(qū)別?局部變量呢?函數(shù)呢?

1)static全局變量與普通全局變量的區(qū)別:static全局變量只初始化一次,防止在其他文件單元中被引用。

2)static局部變量與普通局部變量的區(qū)別:static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值。

3)static函數(shù)與普通函數(shù)的區(qū)別:static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝。

12.什么是類目與延展?

類目:為已知的類增加新的方法。

延展:通知在本類的定義里使用類目來(lái)聲明私有方法。

13.Objective-C中的協(xié)議和Java中的接口區(qū)別?

協(xié)議定義的方法,可以設(shè)置可選實(shí)現(xiàn)和必須實(shí)現(xiàn)。

接口則是必須全部實(shí)現(xiàn)。

14.在一個(gè)對(duì)象的方法里self.name=”object”和name=”object”有什么不同?

前者調(diào)用的是設(shè)置器方法,后者是普通賦值。

15.單例設(shè)計(jì)模式的實(shí)現(xiàn)?為什么使用單例設(shè)計(jì)?

static File *instance = nil;
@implementation File
//獲取單例的方法
+(id)shareInstance {
	@synthesize (self) {
		if(instance == nil) {
			instance = [[File alloc] init];
		}
	}
	return instance;
}
//覆寫(xiě)allocWithZone、copyWithZone、retain、release和autorelease方法,目的是限制這個(gè)類只創(chuàng)建一個(gè)對(duì)象

為什么使用單例設(shè)計(jì)?

1)單例設(shè)計(jì)是用來(lái)限制一個(gè)類只能創(chuàng)建一個(gè)對(duì)象,那么此對(duì)象中的屬性可以存儲(chǔ)全局共享的數(shù)據(jù),所有的類都可以訪問(wèn)、設(shè)置此單例對(duì)象中的屬性數(shù)據(jù)。

2)如果一個(gè)類創(chuàng)建的時(shí)候非常的耗費(fèi)性能,那么此類如果能滿足要求,可以設(shè)置為單例節(jié)約性能。

第四部分

1.層CALayer和UIView的區(qū)別是什么?

兩者最大的區(qū)別是,圖層不會(huì)直接渲染到屏幕上。UIView是iOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都是繼承自它,它本身是由CoreAnimation來(lái)實(shí)現(xiàn)的,它真正繪圖的部分是由一個(gè)CALayer類來(lái)管理的。UIView本身更像是一個(gè)CALayer的管理器。一個(gè)UIView上可以有多個(gè)CALayer,每個(gè)CALayer顯示一種東西,增強(qiáng)UIView的展現(xiàn)能力。

2.什么是GCD?

GCD是Apple開(kāi)發(fā)的一個(gè)多核編程的較新的解決方法。在Mac OS X 10.6雪豹中首次推出,并引入到iOS4.0。GCD是一個(gè)替代諸如NSThread等技術(shù)的很高效和強(qiáng)大的技術(shù)。GCD完全可以處理諸如數(shù)據(jù)鎖定和資源泄漏等復(fù)雜的異步編程問(wèn)題。

3.TCP/UDP的區(qū)別和聯(lián)系?

1)TCP的全稱為傳輸控制協(xié)議,這種協(xié)議可以提供面向連接的、可靠的、點(diǎn)到點(diǎn)的通信。

2)UDP的全稱為用戶數(shù)據(jù)報(bào)協(xié)議,它可以提供非連接的不可靠的點(diǎn)到多點(diǎn)的通信。

3)用TCP還是UDP,需要看程序注重哪一個(gè)方面,需要可靠還是快速。

4.Socket連接和Http連接的區(qū)別?

Http連接:Http連接就是所謂的短鏈接,即客戶端向服務(wù)器發(fā)送一次請(qǐng)求,服務(wù)器響應(yīng)后連接即會(huì)斷掉。

Socket連接:Socket連接就是所謂的長(zhǎng)連接,理論上客戶端和服務(wù)器端一旦建立起連接將不會(huì)主動(dòng)斷掉。

5.什么是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),完成三次握手。

6.frame和bounds的區(qū)別?

frame指的是:該view在父view坐標(biāo)系統(tǒng)中的位置大。▍⒄拯c(diǎn)是父視圖的坐標(biāo)系統(tǒng))。

bounds指的是:該view在本身坐標(biāo)系統(tǒng)中的位置和大。▍⒄拯c(diǎn)是本身的坐標(biāo)系統(tǒng))。

7.如何理解MVC設(shè)計(jì)模式?

MVC是一種架構(gòu)設(shè)計(jì),M表示數(shù)據(jù)模型,V表示視圖,C表示控制器。

數(shù)據(jù)模型:負(fù)責(zé)存儲(chǔ)、定義、操作數(shù)據(jù)。

視圖:用來(lái)展示數(shù)據(jù)給用戶,和用戶進(jìn)行操作交互。

控制器:它是M與V的協(xié)調(diào)者,控制器獲取數(shù)據(jù),將數(shù)據(jù)交給視圖去展示。

8.控制器的xib是怎么加載的?

當(dāng)UIViewController的loadView被調(diào)用時(shí),在此方法中,通過(guò)NSBundle加載xib,先通過(guò)控制器的類名作為xib的文件名加載此xib文件。如果找到此xib文件,則加載為view對(duì)象作為控制器的根視圖,如果沒(méi)有xib文件,則通過(guò)alloc創(chuàng)建一個(gè)view對(duì)象作為根視圖。

9.控制器如何處理系統(tǒng)內(nèi)存不足警告?

內(nèi)存不足時(shí),系統(tǒng)會(huì)調(diào)用控制器didReceiveMemoryWaring方法通知控制器內(nèi)存不足。iOS6.0與6.0之前的處理方式不一樣。

1)iOS6.0之前:調(diào)用didReceiveMemoryWaring后,將self.view設(shè)置為nil,并且再調(diào)用viewDidUnload方法,在此方法中我們應(yīng)該釋放子視圖。

2)iOS6.0之后:調(diào)用didReceiveMemoryWaring后,不再調(diào)用viewDidUnload方法,則應(yīng)該在didReceiveMemoryWaring方法中手動(dòng)將self.view=nil,并且釋放子視圖。

10.iOS中對(duì)象間有哪些通信方式?

代理delegate、block、通知和KVO。

11.block在內(nèi)存管理上的特點(diǎn)?需要注意循環(huán)引用,如何解決循環(huán)引用?

1)block中使用了局部對(duì)象,則會(huì)將此對(duì)象retain,引用了當(dāng)前對(duì)象的屬性或者方法,則會(huì)將當(dāng)前對(duì)象retain。

2)解決循環(huán)引用:將當(dāng)前對(duì)象賦值給一個(gè)局部變量,并且使用__block關(guān)鍵字修飾該局部變量,使用該變量訪問(wèn)當(dāng)前對(duì)象的屬性和方法。

12.Objective-C中有線程池(線程隊(duì)列)嗎?NSOperationQueue是如何管理線程的?

NSOperationQueue是Objective-C的線程池,線程池中可以存放多個(gè)線程。

NSOperationQueue可以管理線程的并發(fā)數(shù),還可以管理線程間的優(yōu)先級(jí)。

13.timer的間隔周期準(zhǔn)嗎?為什么?怎樣實(shí)現(xiàn)一個(gè)精準(zhǔn)的timer?

定時(shí)器timer一般都是準(zhǔn)確的,但是當(dāng)主線程有些時(shí)候難免會(huì)出現(xiàn)堵塞情況,這樣就有可能導(dǎo)致定時(shí)器timer會(huì)延遲從而不準(zhǔn)確。我們可以開(kāi)發(fā)一個(gè)多線程,在此多線程上運(yùn)行定時(shí)器,這樣多線程只運(yùn)行定時(shí)器,不會(huì)因堵塞而導(dǎo)致誤差。

14.Http協(xié)議的特點(diǎn)?GET與POST的區(qū)別?什么是Https協(xié)議?

1)Http協(xié)議是短鏈接,都是客戶端主動(dòng)發(fā)送請(qǐng)求,服務(wù)器做出響應(yīng),服務(wù)器響應(yīng)之后,連接則斷開(kāi)。

2)GET請(qǐng)求沒(méi)有請(qǐng)求體,POST含有請(qǐng)求體,請(qǐng)求參數(shù)可以放入請(qǐng)求體中,所以,POST可以提交大量的數(shù)據(jù)給服務(wù)器,更加安全。

3)HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協(xié)議,它是一個(gè)安全通信通道,它基于HTTP開(kāi)發(fā),用于在客戶計(jì)算機(jī)和服務(wù)器之間交換信息。它使用安全套接字層(SSL)進(jìn)行信息交換,簡(jiǎn)單來(lái)說(shuō)它是HTTP的安全版。

15.XML數(shù)據(jù)的解析方式各有什么不同?JSON解析有哪些框架?

XML數(shù)據(jù)解析有兩種方式:DOM解析和SAX解析。

DOM解析:必須完成DOM樹(shù)的構(gòu)造,在處理規(guī)模較大的XML文檔時(shí)就很耗費(fèi)內(nèi)存,占用資源較多。

SAX解析:與DOM不同的是,SAX是用事件驅(qū)動(dòng)模型,解析XML文檔時(shí)每遇到一個(gè)開(kāi)始或者結(jié)束標(biāo)簽、屬性或一條指令時(shí),程序就產(chǎn)生一個(gè)事件來(lái)進(jìn)行相應(yīng)的處理。因此,SAX相對(duì)于DOM來(lái)說(shuō)更適合操作大的XML文檔。

JSON解析:現(xiàn)在性能比較好的主要是第三方的JSONKit和iOS自帶的JSON解析類,自帶的JSON解析性能是最高的,但是只能是iOS5之后才可以使用。

第五部分

1.tableView是如何復(fù)用的?

如果屏幕上能顯示10個(gè)單元格,則tableView只會(huì)創(chuàng)建11個(gè)單元格,也就是n+1,當(dāng)滑到第12個(gè)單元格時(shí)就會(huì)復(fù)用第1個(gè)單元格對(duì)象。tableView中有個(gè)單元格池的概念,tableView調(diào)用協(xié)議方法獲取單元格時(shí),先從池子中查找是否有可復(fù)用的單元格,如果有則復(fù)用,如果沒(méi)有則創(chuàng)建一個(gè)單元格對(duì)象。

2.如何優(yōu)化tableView的滑動(dòng)速度?

1)復(fù)用單元格。

2)使用不透明的視圖,單元格中盡量少使用動(dòng)畫(huà)。

3)圖片加載使用異步加載,并且設(shè)置圖片加載的并發(fā)數(shù)。

4)滑動(dòng)時(shí)不加載圖片,停止滑動(dòng)開(kāi)始加載。

5)文字、圖片可直接drawInRect繪制。

6)如非必要,減少reloadData全部cell,只reloadRowsAtIndexPaths。

7)如果cell是動(dòng)態(tài)行高度,計(jì)算出高度后緩存。

8)cell高度固定的話直接用cell.rowHeight設(shè)置高度。

3.談?wù)剬?duì)Runloop的理解?

Run loops是線程相關(guān)的基礎(chǔ)框架的一部分。一個(gè)run loop就是一個(gè)事件處理的循環(huán),用來(lái)不停的調(diào)度工作以及處理輸入事件。使用run loop的目的是讓你的線程在有工作的時(shí)候忙于工作,而沒(méi)有工作的時(shí)候處于休眠狀態(tài)。

4.如何調(diào)用drawRect方法與layoutSubView方法?這兩個(gè)方法的作用?

通過(guò)setNeedsLayout方法異步調(diào)用layoutSubView方法。

通過(guò)setNeedsDisplay方法異步調(diào)用drawRect方法。

drawRect方法用于繪圖,layoutSubView方法用于布局子視圖。

5.UIView與UIViewController的關(guān)系?

每個(gè)控制器都有一個(gè)根視圖,控制器UIViewController用來(lái)管理此視圖的加載和顯示。

6.iOS中有哪些手勢(shì)?

輕擊、捏合、平移、輕掃、旋轉(zhuǎn)和長(zhǎng)按。

7.Http和Socket的區(qū)別?

Http是客戶端用Http協(xié)議進(jìn)行請(qǐng)求,發(fā)送請(qǐng)求時(shí)需要封裝http請(qǐng)求頭,并綁定請(qǐng)求的數(shù)據(jù),服務(wù)器一般有Web服務(wù)器配合(當(dāng)然也非絕對(duì))。Http請(qǐng)求方式為客戶端主動(dòng)發(fā)起請(qǐng)求,服務(wù)器才能給響應(yīng),一次請(qǐng)求完畢后則斷開(kāi)連接,以節(jié)省資源。服務(wù)器不能主動(dòng)給客戶端響應(yīng)(除非采用http長(zhǎng)連接技術(shù))。iPhone主要使用的類是NSURLConnection。

Socket是客戶端跟服務(wù)器直接使用Socket套接字進(jìn)行連接,并沒(méi)有規(guī)定連接后斷開(kāi),所以客戶端和服務(wù)器可以保持連接通道,雙方都可以主動(dòng)發(fā)送數(shù)據(jù)。一般在游戲開(kāi)發(fā)或股票開(kāi)發(fā),這種要求即時(shí)性很強(qiáng)并且保持發(fā)送數(shù)據(jù)量比較大的場(chǎng)合使用。主要使用的類是CFSocketRef。

8.storyboard有什么特點(diǎn)?

storyboard是iOS5新增的特性,是對(duì)xib的升級(jí)版本,引入了一個(gè)容器用于管理多個(gè)xib文件,和它們之間的跳轉(zhuǎn)交互。

優(yōu)點(diǎn):不用再為每個(gè)控制器創(chuàng)建xib文件;可以使用靜態(tài)cell,當(dāng)cell固定且不多時(shí),使用起來(lái)比較方便。

缺點(diǎn):storyboard單個(gè)文件,不利于團(tuán)隊(duì)協(xié)作開(kāi)發(fā)。

9.如何打包靜態(tài)庫(kù)?

新建一個(gè)Framework&Library的項(xiàng)目,編譯的時(shí)候會(huì)將項(xiàng)目中的代碼文件打包成一個(gè).a靜態(tài)庫(kù)文件。

10.APP發(fā)布的上架流程?

1)在蘋(píng)果官網(wǎng)的開(kāi)發(fā)者中心,新建一個(gè)APP,填寫(xiě)此APP相關(guān)的一些描述信息。

2)下載安裝發(fā)布證書(shū)。

3)選擇發(fā)布證書(shū),使用Archive編譯發(fā)布包。

4)使用Xcode提交發(fā)布包。

11.iOS5有哪些新特性?

iCloud、定制UI、storyboard、ARC、CoreImage濾鏡、新增JSON解析類。

12.iOS6有哪些新特性?

UIRefreshControl水滴效果下拉刷新、UICollectionView控件的使用、SLComposeViewController新浪微博控件、PassKit中Passbook、AutoLayout自動(dòng)布局。

13、iOS7有哪些新特性?

系統(tǒng):全新的UI設(shè)計(jì)與交互;Control Center控制中心;全新的多任務(wù)Multitasking;AirDrop共享文件;全新的Safari瀏覽器交互式體驗(yàn)。

SDK:動(dòng)態(tài)UIKit,新增了UIDynamicItem委托,用來(lái)為UIView制定動(dòng)態(tài)行為;新增游戲引擎Sprite Kit Framework框架,類似于Cocos2D。

14.ARC有什么特點(diǎn)?

ARC是編譯器特性,iOS5.0新添加的特性,使用ARC開(kāi)發(fā)者不需要再retain、release、autorelease,因?yàn)榫幾g器會(huì)在合適的地方自動(dòng)插入retain、release。

ARC不會(huì)因少release而導(dǎo)致內(nèi)存泄漏,過(guò)度使用release導(dǎo)致程序崩潰,

ARC可以產(chǎn)生更簡(jiǎn)潔的代碼和更健壯的應(yīng)用。

15.SVN、Git協(xié)作開(kāi)發(fā),怎么防止代碼文件沖突?

防止代碼沖突:不要多人同時(shí)修改同一個(gè)文件。例如,A、B都修改同一個(gè)文件,先讓A修改,然后提交到服務(wù)器,然后B更新下來(lái),再進(jìn)行修改。

服務(wù)器上的項(xiàng)目文件xcodeproj,僅讓一個(gè)人管理提交,其他人只更新。防止此文件產(chǎn)生沖突。

第六部分

1.什么是ARC?

ARC是automatic reference counting自動(dòng)引用計(jì)數(shù),在程序編譯時(shí)自動(dòng)加入retain/release。在對(duì)象被創(chuàng)建時(shí)retain count+1,在對(duì)象被release時(shí)count-1,當(dāng)count=0時(shí),銷毀對(duì)象。程序中加入autoreleasepool對(duì)象會(huì)由系統(tǒng)自動(dòng)加上autorelease方法,如果該對(duì)象引用計(jì)數(shù)為0,則銷毀。那么ARC是為了解決MRC手動(dòng)管理內(nèi)存存在的一些而誕生的。

MRC下內(nèi)存管理的缺點(diǎn):

1)釋放一個(gè)堆內(nèi)存時(shí),首先要確定指向這個(gè)堆空間的指針都被release了。(避免提前釋放)

2)釋放指針指向的堆空間,首先要確定哪些指向同一個(gè)堆,這些指針只能釋放一次。(避免釋放多次,造成內(nèi)存泄露)

3)模塊化操作時(shí),對(duì)象可能被多個(gè)模塊創(chuàng)建和使用,不能確定最后由誰(shuí)釋放。

4)多線程操作時(shí),不確定哪個(gè)線程最后使用完畢。

雖然ARC給我們編程帶來(lái)的很多好多,但也可能出現(xiàn)內(nèi)存泄露。如下面兩種情況:

1)循環(huán)參照:A有個(gè)屬性參照B,B有個(gè)屬性參照A,如果都是strong參照的話,兩個(gè)對(duì)象都無(wú)法釋放。

2)死循環(huán):如果有個(gè)ViewController中有無(wú)限循環(huán),也會(huì)導(dǎo)致即使ViewController對(duì)應(yīng)的view消失了,ViewController也不能釋放。

2.block一般用哪個(gè)關(guān)鍵字修飾,為什么?

block一般使用copy關(guān)鍵之進(jìn)行修飾,block使用copy是從MRC遺留下來(lái)的“傳統(tǒng)”,在MRC中,方法內(nèi)容的block是在棧區(qū)的,使用copy可以把它放到堆區(qū)。但在ARC中寫(xiě)不寫(xiě)都行:編譯器自動(dòng)對(duì)block進(jìn)行了copy操作。

3.用@property聲明的NSString(或NSArray,NSDictionary)經(jīng)常

使用copy關(guān)鍵字,為什么?如果改用strong關(guān)鍵字,可能造成什么問(wèn)題?

用@property聲明 NSString、NSArray、NSDictionary 經(jīng)常使用copy關(guān)鍵字,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString、NSMutableArray、NSMutableDictionary,他們之間可能進(jìn)行賦值操作,為確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng),應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份。

如果我們使用是strong,那么這個(gè)屬性就有可能指向一個(gè)可變對(duì)象,如果這個(gè)可變對(duì)象在外部被修改了,那么會(huì)影響該屬性。

copy此特質(zhì)所表達(dá)的所屬關(guān)系與strong類似。然而設(shè)置方法并不保留新值,而是將其“拷貝” (copy)。 當(dāng)屬性類型為NSString時(shí),經(jīng)常用此特質(zhì)來(lái)保護(hù)其封裝性,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向一個(gè)NSMutableString類的實(shí)例。這個(gè)類是NSString的子類,表示一種可修改其值的字符串,此時(shí)若是不拷貝字符串,那么設(shè)置完屬性之后,字符串的值就可能會(huì)在對(duì)象不知情的情況下遭人更改。所以,這時(shí)就要拷貝一份“不可變” (immutable)的字符串,確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng)。只要實(shí)現(xiàn)屬性所用的對(duì)象是“可變的” (mutable),就應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份。

4.runloop、autorelease pool以及線程之間的關(guān)系?

每個(gè)線程(包含主線程)都有一個(gè)Runloop。對(duì)于每一個(gè)Runloop,系統(tǒng)會(huì)隱式創(chuàng)建一個(gè)Autorelease pool,這樣所有的release pool會(huì)構(gòu)成一個(gè)像callstack一樣的一個(gè)棧式結(jié)構(gòu),在每一個(gè)Runloop結(jié)束時(shí),當(dāng)前棧頂?shù)腁utorelease pool會(huì)被銷毀,這樣這個(gè)pool里的每個(gè)Object會(huì)被release。

[email protected] 的本質(zhì)是什么?ivar、getter、setter 是如何生成并添加到這個(gè)類中的?

“屬性”(property)有兩大概念:ivar(實(shí)例變量)、存取方法(access method=getter),即@property = ivar + getter + setter。

例如下面的這個(gè)類:

@interface WBTextView :UITextView  
@property (nonatomic,copy)NSString *placehold;  
@property (nonatomic,copy)UIColor *placeholdColor;  
@end

類完成屬性的定以后,編譯器會(huì)自動(dòng)編寫(xiě)訪問(wèn)這些屬性的方法(自動(dòng)合成autosynthesis),上述代碼寫(xiě)出來(lái)的類等效與下面的代碼:

@interface WBTextView :UITextView  
- (NSString *)placehold;  
-(void)setPlacehold:(NSString *)placehold;  
-(UIColor *)placeholdColor;  
-(void)setPlaceholdColor:(UIColor *)placeholdColor;  
@end

詳細(xì)介紹見(jiàn): http://blog.csdn.net/jasonjwl/article/details/49427377

6.分別寫(xiě)一個(gè)setter方法用于完成 @property (nonatomic,retain)NSString *name 和 @property (nonatomic,copy) NSString *name ?

retain屬性的setter方法是保留新值并釋放舊值,然后更新實(shí)例變量,令其指向新值。順序很重要。假如還未保留新值就先把舊值釋放了,而且兩個(gè)值又指向同一個(gè)對(duì)象,先執(zhí)行的release操作就可能導(dǎo)致系統(tǒng)將此對(duì)象永久回收。

-(void)setName:(NSString *)name{
    [name retain];
    [_name release];
    _name = name;
}
-(void)setName:(NSString *)name{     
    [_name release];
    _name = [name copy];
}

7.說(shuō)說(shuō)assign和weak,_block和 _weak的區(qū)別?

assign適用于基本數(shù)據(jù)類型,weak是適用于NSObject對(duì)象,并且是一個(gè)弱引用。

assign其實(shí)也可以用來(lái)修飾對(duì)象,那么為什么不用它呢?因?yàn)楸籥ssign修飾的對(duì)象在釋放之后,指針的地址還是存在的,也就是說(shuō)指針并沒(méi)有被置為nil。如果在后續(xù)內(nèi)存分配中,剛巧分到了這塊地址,程序就會(huì)崩潰掉。而weak修飾的對(duì)象在釋放之后,指針地址會(huì)被置為nil。

_block 是用來(lái)修飾一個(gè)變量,這個(gè)變量就可以在block中被修改。

_block :使用_block修飾的變量在block代碼塊中會(huì)被retain(ARC下,MRC下不會(huì)retain)。

_weak:使用_weak修飾的變量不會(huì)在block代碼塊中被retain。

8.請(qǐng)說(shuō)出下面代碼是否有問(wèn)題,如果有問(wèn)題請(qǐng)修改?

@autoreleasepool {
        for (int i=0; i<largeNumber; i++) {
            Person *per = [[Person alloc] init];
            [per autorelease];
        }
    }

內(nèi)存管理的原則:如果對(duì)一個(gè)對(duì)象使用了alloc、copy、retain,那么你必須使用相應(yīng)的release或者autorelease。咋一看,這道題目有alloc,也有autorelease,兩者對(duì)應(yīng)起來(lái),應(yīng)該沒(méi)問(wèn)題。但autorelease雖然會(huì)使引用計(jì)數(shù)減一,但是它并不是立即減一,它的本質(zhì)功能只是把對(duì)象放到離他最近的自動(dòng)釋放池里。當(dāng)自動(dòng)釋放池銷毀了,才會(huì)向自動(dòng)釋放池中的每一個(gè)對(duì)象發(fā)送release消息。這道題的問(wèn)題就在autorelease。因?yàn)閘argeNumber是一個(gè)很大的數(shù),autorelease又不能使引用計(jì)數(shù)立即減一,所以在循環(huán)結(jié)束前會(huì)造成內(nèi)存溢出的問(wèn)題。

解決方案如下:

@autoreleasepool {
        for (int i=0; i<100000; i++) { 
            @autoreleasepool {
            Person *per = [[Person alloc] init];
            [per autorelease];
        }
      }
    }

在循環(huán)內(nèi)部再加一個(gè)自動(dòng)釋放池,這樣就能保證每創(chuàng)建一個(gè)對(duì)象就能及時(shí)釋放。

9.請(qǐng)問(wèn)下面代碼是否有問(wèn)題,如有問(wèn)題請(qǐng)修改?

@autoreleasepool {
        NSString *str = [[NSString alloc] init];
        [str retain];
        [str retain];
        str = @"jxl";
        [str release];
        [str release];
        [str release];
}

這道題跟第8題一樣存在內(nèi)存泄露問(wèn)題,

1)內(nèi)存泄露 ;

2)指向常量區(qū)的對(duì)象不能release。

指針變量str原本指向一塊開(kāi)辟的堆區(qū)空間,但是經(jīng)過(guò)重新給str賦值,str的指向發(fā)生了變化,由原來(lái)指向堆區(qū)空間,到指向常量區(qū)。常量區(qū)的變量根本不需要釋放,這就導(dǎo)致了原來(lái)開(kāi)辟的堆區(qū)空間沒(méi)有釋放,造成內(nèi)存泄露。

10.什么情況下使用weak關(guān)鍵字,相比assign有什么不同?什么情況使用weak關(guān)鍵字?

1)在ARC中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過(guò)讓其中一端使用weak來(lái)解決。比如delegate代理。

2)自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒(méi)有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用weak,自定義控件屬性一般也使用weak。

不同點(diǎn):

1)weak此特性表明該屬性定義了一種“非擁有關(guān)系”。為這種屬性設(shè)置新值時(shí),設(shè)置方法既不保留新值,也不釋放舊值。此特性與assign一樣,然而在屬性所指的對(duì)象遭到銷毀時(shí),屬性值也會(huì)清空。而assign的“設(shè)置方法”只會(huì)執(zhí)行針對(duì)“純量類型” (scalar type,例如 CGFloat 或 NSlnteger 等)的簡(jiǎn)單賦值操作。

2)assign可以用非OC對(duì)象,而weak必須用于OC對(duì)象。

11.內(nèi)存管理語(yǔ)義(assign、strong、weak等的區(qū)別)?

1)assign “設(shè)置方法” 只會(huì)執(zhí)行針對(duì)“純量”的簡(jiǎn)單賦值操作。

2)strong 此特性表明該屬性定義了一種“擁有關(guān)系”。為這種屬性設(shè)置新值時(shí),設(shè)置方法會(huì)先保留新值,并釋放舊值,然后再將新值設(shè)置上去。

3)weak 此特性表明該屬性定義了一種“非擁有關(guān)系”。為這種屬性設(shè)置新值時(shí),設(shè)置方法既不保留新值,也不釋放舊值。此特性同assign類似,然而在屬性所指的對(duì)象遭到銷毀時(shí),屬性值也會(huì)清空。

4)unsafe_unretained 此特性的語(yǔ)義和assign相同,但是它適用于“對(duì)象類型”,該特性表達(dá)一種“非擁有關(guān)系”,當(dāng)目標(biāo)對(duì)象遭到銷毀時(shí),屬性值不會(huì)自動(dòng)清空,這一點(diǎn)與weak有區(qū)別。

5)copy 此特性所表達(dá)的所屬關(guān)系與strong類似。然而設(shè)置方法并不保留新值,而是將其“拷貝”。當(dāng)屬性類型為NSString*時(shí),經(jīng)常用此特性來(lái)保護(hù)其封裝性,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向一個(gè)NSMutableString類的實(shí)例。這個(gè)類是NSString的子類,表示一種可以修改其值的字符串,此時(shí)若是不拷貝字符串,那么設(shè)置完屬性之后,字符串的值就可能會(huì)在對(duì)象不知情的情況下遭人更改。所以,這時(shí)就要拷貝一份“不可變”的字符串,確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng)。只要實(shí)現(xiàn)屬性所用的對(duì)象是“可變的”,就應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份。

 

來(lái)自:http://charsdavy.github.io/2017/03/28/ios-interview/

 

標(biāo)簽: isp ssl web服務(wù)器 安全 代碼 服務(wù)器 服務(wù)器端 開(kāi)發(fā)者 數(shù)據(jù)庫(kù) 通信

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:Python 中 "is" 與 "==" 操作有什么區(qū)別?

下一篇:Java線程內(nèi)存模型,線程、工作內(nèi)存、主內(nèi)存