2023年最全的iOS面試題及答案_第1頁
2023年最全的iOS面試題及答案_第2頁
2023年最全的iOS面試題及答案_第3頁
2023年最全的iOS面試題及答案_第4頁
2023年最全的iOS面試題及答案_第5頁
已閱讀5頁,還剩111頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

史上最全的iOS面試題及答案

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

(id)initWithCString:(c*****tchar*)nullTerminatedCStringencoding:(NSStringEncoding)encoding;

+(id)stringWithCString:(c*****tchar*)nullTerminatedCString

encoding:(NSStringEncoding)encoding

{

NSString

*obj;

obj=[selfallocWithZone:NSDefaultMallocZone()];

obj=[objinitWithCString:nullTerminatedCStringencoding:encoding];

returnAUTORELEASE(obj);

}

2static

關(guān)鍵字的作用:

(1)函數(shù)體內(nèi)

static

變量的作用范圍為該函數(shù)體,不同于

auto

變量,該變量的內(nèi)存只被分派一次,

因此其值在下次調(diào)用時(shí)仍維持上次的值;

(2)在模塊內(nèi)的

static

全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問;

(3)在模塊內(nèi)的

static

函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個(gè)函數(shù)的使用范圍被限制在聲明

它的模塊內(nèi);

(4)在類中的

static

成員變量屬于整個(gè)類所擁有,對(duì)類的所有對(duì)象只有一份拷貝;

(5)在類中的

static

成員函數(shù)屬于整個(gè)類所擁有,這個(gè)函數(shù)不接受

this

指針,因而只能訪問類的static

成員變量。

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

進(jìn)程和線程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)營的基本單元,系統(tǒng)運(yùn)用該基本單元實(shí)現(xiàn)系統(tǒng)相應(yīng)用的并發(fā)性。

程和線程的重要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行途徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),花費(fèi)資源較大,效率要差一些。但對(duì)于一些規(guī)定同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。4堆和棧的區(qū)別

管理方式:對(duì)于棧來講,是由編譯器自動(dòng)管理,無需我們手工控制;對(duì)于堆來說,釋放工作由程序員控制,容易產(chǎn)生memoryleak。

申請(qǐng)大?。?/p>

棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在

WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個(gè)編譯時(shí)就擬定的常數(shù)),假如申請(qǐng)的空間超過棧的剩余空間時(shí),將提醒overflow。因此,能從棧獲得的空間較小。

堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲(chǔ)的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。

碎片問題:對(duì)于堆來講,頻繁的new/delete勢(shì)必會(huì)導(dǎo)致內(nèi)存空間的不連續(xù),從而導(dǎo)致大量的碎片,使程序效率減少。對(duì)于棧來講,則不會(huì)存在這個(gè)問題,由于棧是先進(jìn)后出的隊(duì)列,他們是如此的一一相應(yīng),以至于永遠(yuǎn)都不也許有一個(gè)內(nèi)存塊從棧中間彈出

分派方式:堆都是動(dòng)態(tài)分派的,沒有靜態(tài)分派的堆。棧有2種分派方式:靜態(tài)分派和動(dòng)態(tài)分派。靜態(tài)分派是編譯器完畢的,比如局部變量的分派。動(dòng)態(tài)分派由alloca函數(shù)進(jìn)行分派,但是棧的動(dòng)態(tài)分派和堆是不同的,他的動(dòng)態(tài)分派是由編譯器進(jìn)行釋放,無需我們手工實(shí)現(xiàn)。

分派效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分派專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫提供的,它的機(jī)制是很復(fù)雜的。5什么是鍵-值,鍵途徑是什么

模型的性質(zhì)是通過一個(gè)簡樸的鍵(通常是個(gè)字符串)來指定的。視圖和控制器通過鍵來查找相應(yīng)的屬性值。在一個(gè)給定的實(shí)體中,同一個(gè)屬性的所有值具有相同的數(shù)據(jù)類型。鍵-值編碼技術(shù)用于進(jìn)行這樣的查找—它是一種間接訪問對(duì)象屬性的機(jī)制。

鍵途徑是一個(gè)由用點(diǎn)作分隔符的鍵組成的字符串,用于指定一個(gè)連接在一起的對(duì)象性質(zhì)序列。第一個(gè)鍵的

性質(zhì)是由先前的性質(zhì)決定的,接下來每個(gè)鍵的值也是相對(duì)于其前面的性質(zhì)。鍵途徑使您可以以獨(dú)立于模型

實(shí)現(xiàn)的方式指定相關(guān)對(duì)象的性質(zhì)。通過鍵途徑,您可以指定對(duì)象圖中的一個(gè)任意深度的途徑,使其指向相

關(guān)對(duì)象的特定屬性。

6目的-動(dòng)作機(jī)制

目的是動(dòng)作消息的接受者。一個(gè)控件,或者更為常見的是它的單元,以插座變量(參見"插座變量"部分)

的形式保有其動(dòng)作消息的目的。

動(dòng)作是控件發(fā)送給目的的消息,或者從目的的角度看,它是目的為了響應(yīng)動(dòng)作而實(shí)現(xiàn)的方法。

程序需要某些機(jī)制來進(jìn)行事件和指令的翻譯。這個(gè)機(jī)制就是目的-動(dòng)作機(jī)制。

7objc的內(nèi)存管理

??

假如您通過度派和初始化(比如[[MyClassalloc]init])的方式來創(chuàng)建對(duì)象,您就擁

有這個(gè)對(duì)象,需要負(fù)責(zé)該對(duì)象的釋放。這個(gè)規(guī)則在使用NSObject的便利方法new

時(shí)也同樣合用。

??

假如您拷貝一個(gè)對(duì)象,您也擁有拷貝得到的對(duì)象,需要負(fù)責(zé)該對(duì)象的釋放。

??

假如您保持一個(gè)對(duì)象,您就部分擁有這個(gè)對(duì)象,需要在不再使用時(shí)釋放該對(duì)象。

反過來,

??

假如您從其它對(duì)象那里接受到一個(gè)對(duì)象,則您不擁有該對(duì)象,也不應(yīng)當(dāng)釋放它(這個(gè)規(guī)則有少數(shù)

的例外,在參考文檔中有顯式的說明)。

8

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

當(dāng)您向一個(gè)對(duì)象發(fā)送一個(gè)autorelease消息時(shí),Cocoa就會(huì)將該對(duì)象的一個(gè)引用放入到最新的自動(dòng)釋放池。它仍然是個(gè)合法的對(duì)象,因此自動(dòng)釋放池定義的作用域內(nèi)的其它對(duì)象可以向它發(fā)送消息。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時(shí),自動(dòng)釋放池就會(huì)被釋放,池中的所有對(duì)象也就被釋放。

1.

ojc-c

是通過一種"referringcounting"(引用計(jì)數(shù))的方式來管理內(nèi)存的,

對(duì)象在開始分派內(nèi)存(alloc)的時(shí)候引用計(jì)數(shù)為一,以后每當(dāng)碰到有copy,retain的時(shí)候引用計(jì)數(shù)都會(huì)加一,

每當(dāng)碰到release和autorelease的時(shí)候引用計(jì)數(shù)就會(huì)減一,假如此對(duì)象的計(jì)數(shù)變?yōu)榱?,

就會(huì)被系統(tǒng)銷毀.

2.NSAutoreleasePool

就是用來做引用計(jì)數(shù)的管理工作的,這個(gè)東西一般不用你管的.

3.autorelease和release沒什么區(qū)別,只是引用計(jì)數(shù)減一的時(shí)機(jī)不同而已,autorelease會(huì)在對(duì)象的使用真正結(jié)束的時(shí)候才做引用計(jì)數(shù)減一.

9類工廠方法是什么

類工廠方法的實(shí)現(xiàn)是為了向客戶提供方便,它們將分派和初始化合在一個(gè)環(huán)節(jié)中,返回被創(chuàng)建的對(duì)象,并

進(jìn)行自動(dòng)釋放解決。這些方法的形式是+(type)className...(其中

className不涉及任何前綴)。

工廠方法也許不僅僅為了方便使用。它們不僅可以將分派和初始化合在一起,還可認(rèn)為初始化過程提供對(duì)

象的分派信息。

類工廠方法的另一個(gè)目的是使類(比如NSWorkspace)提供單件實(shí)例。雖然init...方法可以確認(rèn)一

個(gè)類在每次程序運(yùn)營過程只存在一個(gè)實(shí)例,但它需要一方面分派一個(gè)“生的”實(shí)例,然后還必須釋放該實(shí)例。

工廠方法則可以避免為也許沒有用的對(duì)象盲目分派內(nèi)存。

10單件實(shí)例是什么

Foundation

ApplicationKit

框架中的一些類只允許創(chuàng)建單件對(duì)象,即這些類在當(dāng)前進(jìn)程中的唯一實(shí)例。舉例來說,NSFileManager

和NSWorkspace

類在使用時(shí)都是基于進(jìn)程進(jìn)行單件對(duì)象的實(shí)例化。當(dāng)向這些類請(qǐng)求實(shí)例的時(shí)候,它們會(huì)向您傳遞單一實(shí)例的一個(gè)引用,假如該實(shí)例還不存在,則一方面進(jìn)行實(shí)例的分派和初始化。單件對(duì)象充當(dāng)控制中心的角色,負(fù)責(zé)指引或協(xié)調(diào)類的各種服務(wù)。假如類在概念上只有一個(gè)實(shí)例(比如

NSWorkspace),就應(yīng)當(dāng)產(chǎn)生一個(gè)單件實(shí)例,而不是多個(gè)實(shí)例;假如將來某一天也許有多個(gè)實(shí)例,您可

以使用單件實(shí)例機(jī)制,而不是工廠方法或函數(shù)。11動(dòng)態(tài)綁定

—在運(yùn)營時(shí)擬定要調(diào)用的方法

動(dòng)態(tài)綁定將調(diào)用方法的擬定也推遲到運(yùn)營時(shí)。在編譯時(shí),方法的調(diào)用并不和代碼綁定在一起,只有在消實(shí)發(fā)送出來之后,才擬定被調(diào)用的代碼。通過動(dòng)態(tài)類型和動(dòng)態(tài)綁定技術(shù),您的代碼每次執(zhí)行都可以得到不同的結(jié)果。運(yùn)營時(shí)因子負(fù)責(zé)擬定消息的接受者和被調(diào)用的方法。運(yùn)營時(shí)的消息分發(fā)機(jī)制為動(dòng)態(tài)綁定提供支持。當(dāng)您向一個(gè)動(dòng)態(tài)類型擬定了的對(duì)象發(fā)送消息時(shí),運(yùn)營環(huán)境系統(tǒng)會(huì)通過接受者的isa指針定位對(duì)象的類,并以此為起點(diǎn)擬定被調(diào)用的方法,方法和消息是動(dòng)態(tài)綁定的。并且,您不必在Objective-C

代碼中做任何工作,就可以自動(dòng)獲取動(dòng)態(tài)綁定的好處。您在每次發(fā)送消息時(shí),

特別是當(dāng)消息的接受者是動(dòng)態(tài)類型已經(jīng)擬定的對(duì)象時(shí),動(dòng)態(tài)綁定就會(huì)例行而透明地發(fā)生。12obj-c的優(yōu)缺陷

objc優(yōu)點(diǎn):

1)Cateogies

2)Posing

3)

動(dòng)態(tài)辨認(rèn)

4)

指標(biāo)計(jì)算

5)彈性訊息傳遞

6)

不是一個(gè)過度復(fù)雜的

C

衍生語言

7)Objective-C

C++

可混合編程

缺陷:

1)

不支援命名空間

2)

不支持運(yùn)算符重載

3)不支持多重繼承

4)使用動(dòng)態(tài)運(yùn)營時(shí)類型,所有的方法都是函數(shù)調(diào)用,所以很多編譯時(shí)優(yōu)化方法都用不到。(如內(nèi)聯(lián)函數(shù)等),性能低劣。

13sprintf,strcpy,memcpy使用上有什么要注意的地方

strcpy是一個(gè)字符串拷貝的函數(shù),它的函數(shù)原型為strcpy(char*dst,c*****tchar*src);

src開始的一段字符串拷貝到dst開始的內(nèi)存中去,結(jié)束的標(biāo)志符號(hào)為'\0',由于拷貝的長度不是由我們自己控制的,所以這個(gè)字符串拷貝很容易犯錯(cuò)。具有字符串拷貝功能的函數(shù)有memcpy,這是一個(gè)內(nèi)存拷貝函數(shù),它的函數(shù)原型為memcpy(char*dst,c*****tchar*src,unsignedintlen);

將長度為len的一段內(nèi)存,從src拷貝到dst中去,這個(gè)函數(shù)的長度可控。但是會(huì)有內(nèi)存疊加的問題。

sprintf是格式化函數(shù)。將一段數(shù)據(jù)通過特定的格式,格式化到一個(gè)字符串緩沖區(qū)中去。sprintf格式化的函數(shù)的長度不可控,有也許格式化后的字符串會(huì)超過緩沖區(qū)的大小,導(dǎo)致溢出。

14答案是:

a)inta;//Aninteger

b)int*a;//Apointertoaninteger

c)int**a;//Apointertoapointertoaninteger

d)inta[10];//Anarrayof10integers

e)int*a[10];//Anarrayof10pointerstointegers

f)int(*a)[10];//Apointertoanarrayof10integers

g)int(*a)(int);//Apointertoafunctionathat

takesanintegerargumentandreturnsaninteger

h)int(*a[10])(int);//Anarrayof10pointerstofuncti*****

thattakeanintegerargumentandreturnaninteger

15.readwrite,readonly,assign,retain,copy,nonatomic屬性的作用

@property是一個(gè)屬性訪問聲明,擴(kuò)號(hào)內(nèi)支持以下幾個(gè)屬性:

1,getter=getterName,setter=setterName,設(shè)立setter與getter的方法名

2,readwrite,readonly,設(shè)立可供訪問級(jí)別

2,assign,setter方法直接賦值,不進(jìn)行任何retain操作,為了解決原類型與環(huán)循引用問題

3,retain,setter方法對(duì)參數(shù)進(jìn)行release舊值再retain新值,所有實(shí)現(xiàn)都是這個(gè)順序(CC上有相關(guān)資料)

4,copy,setter方法進(jìn)行Copy操作,與retain解決流程同樣,先舊值release,再Copy出新的對(duì)象,retainCount為1。這是為了減少對(duì)上下文的依賴而引入的機(jī)制。

copy是在你不希望a和b共享一塊內(nèi)存時(shí)會(huì)使用到。a和b各自有自己的內(nèi)存。5,nonatomic,非原子性訪問,不加同步,多線程并發(fā)訪問會(huì)提高性能。注意,假如不加此屬性,則默認(rèn)是兩個(gè)訪問方法都為原子型事務(wù)訪問。鎖被加到所屬對(duì)象實(shí)例級(jí)(我是這么理解的...)。atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多線程環(huán)境下,原子操作是必要的,否則有也許引起錯(cuò)誤的結(jié)果。加了atomic,setter函數(shù)會(huì)變成下面這樣:16什么時(shí)候用delegate,什么時(shí)候用Notification?答:delegate針對(duì)one-to-one關(guān)系,并且reciever可以返回值

給sender,notification

可以針對(duì)one-to-one/many/none,reciever無法返回值給sender.所以,delegate用于sender希望接受到

reciever的某個(gè)功能反饋值,notification用于告知多個(gè)object某個(gè)事件。

17什么是KVC和KVO?答:KVC(Key-Value-Coding)內(nèi)部的實(shí)現(xiàn):一個(gè)對(duì)象在調(diào)用setValue的時(shí)候,(1)一方面根據(jù)方法名找到運(yùn)營方法的時(shí)候所需要的環(huán)境參數(shù)。(2)他會(huì)從自己isa指針結(jié)合環(huán)境參數(shù),找到具體的方法實(shí)現(xiàn)的接口。(3)再直接查找得來的具體的方法實(shí)現(xiàn)。KVO(Key-Value-Observing):當(dāng)觀測(cè)者為一個(gè)對(duì)象的屬性進(jìn)行了注冊(cè),被觀測(cè)對(duì)象的isa指針被修改的時(shí)候,isa指針就會(huì)指向一個(gè)中間類,而不是真實(shí)的類。所以

isa指針其實(shí)不需要指向?qū)嵗龑?duì)象真實(shí)的類。所以我們的程序最佳不要依賴于isa指針。在調(diào)用類的方法的時(shí)候,最佳要明確對(duì)象實(shí)例的類名18ViewController

loadView,viewDidLoad,viewDidUnload

分別是在什么時(shí)候調(diào)用的?在自定義ViewController的時(shí)候這幾個(gè)函數(shù)里面應(yīng)當(dāng)做什么工作?答:viewDidLoad在view

從nib文獻(xiàn)初始化時(shí)調(diào)用,loadView在controller的view為nil時(shí)調(diào)用。此方法在編程實(shí)現(xiàn)view時(shí)調(diào)用,view

控制器默認(rèn)會(huì)注冊(cè)memorywarningnotification,當(dāng)viewcontroller的任何view

沒有用的時(shí)候,viewDidUnload會(huì)被調(diào)用,在這里實(shí)現(xiàn)將retain

的viewrelease,假如是retain的IBOutletview

屬性則不要在這里release,IBOutlet會(huì)負(fù)責(zé)release

。19"NSMutableString*"這個(gè)數(shù)據(jù)類型則是代表"NSMutableString"對(duì)象自身,這兩者是有區(qū)別的。而NSString只是對(duì)象的指針而已。面向過程就是分析出解決問題所需要的環(huán)節(jié),然后用函數(shù)把這些環(huán)節(jié)一步一步實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)依次調(diào)用就可以了。

面向?qū)ο笫前褬?gòu)成問題事務(wù)分解成各個(gè)對(duì)象,建立對(duì)象的目的不是為了完畢一個(gè)環(huán)節(jié),而是為了描敘某個(gè)事物在整個(gè)解決問題的環(huán)節(jié)中的行為。;20類別的作用類別重要有3個(gè)作用:(1)將類的實(shí)現(xiàn)分散到多個(gè)不同文獻(xiàn)或多個(gè)不同框架中。(2)創(chuàng)建對(duì)私有方法的前向引用。(3)向?qū)ο筇砑臃钦絽f(xié)議。類別的局限性有兩方面局限性:(1)無法向類中添加新的實(shí)例變量,類別沒有位置容納實(shí)例變量。(2)名稱沖突,即當(dāng)類別中的方法與原始類方法名稱沖突時(shí),類別具有更高的優(yōu)先級(jí)。類別方法將完全取代初始方法從而無法再使用初始方法。無法添加實(shí)例變量的局限可以使用字典對(duì)象解決21關(guān)鍵字volatile有什么含意?并給出三個(gè)不同的例子:一個(gè)定義為volatile的變量是說這變量也許會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個(gè)例子:?

并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)?

一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non-automaticvariables)?

多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量

?

一個(gè)參數(shù)既可以是const還可以是volatile嗎?解釋為什么。?

一個(gè)指針可以是volatile

嗎?解釋為什么。

下面是答案:?

是的。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile由于它也許被意想不到地改變。它是const由于程序不應(yīng)當(dāng)試圖去修改它。?

是的。盡管這并不很常見。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)。22@synthesize

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

是開發(fā)者自已提供相應(yīng)的屬性聲明@dynamic

意思是由開發(fā)人員提供相應(yīng)的代碼:對(duì)于只讀屬性需要提供

setter,對(duì)于讀寫屬性需要提供

setter

和getter。@synthesize

意思是,除非開發(fā)人員已經(jīng)做了,否則由編譯器生成相應(yīng)的代碼,以滿足屬性聲明。

查閱了一些資料擬定@dynamic的意思是告訴編譯器,屬性的獲取與賦值方法由用戶自己實(shí)現(xiàn),

不自動(dòng)生成。23Differencebetweenshallowcopyanddeepcopy?

淺復(fù)制和深復(fù)制的區(qū)別?

答案:淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔槪粡?fù)制引用對(duì)象自身。

深層復(fù)制:復(fù)制引用對(duì)象自身。

意思就是說我有個(gè)A對(duì)象,復(fù)制一份后得到A_copy對(duì)象后,對(duì)于淺復(fù)制來說,A和A_copy指向的是同一個(gè)內(nèi)存資源,復(fù)制的只但是是是一個(gè)指針,對(duì)象自身資源

還是只有一份,那假如我們對(duì)A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對(duì)象同樣被修改,這其實(shí)違反了我們復(fù)制拷貝的一個(gè)思想。深復(fù)制就好理解了,內(nèi)存中存在了

兩份獨(dú)立對(duì)象自身。

用網(wǎng)上一哥們通俗的話將就是:

淺復(fù)制好比你和你的影子,你完蛋,你的影子也完蛋

深復(fù)制好比你和你的克隆人,你完蛋,你的克隆人還活著。24Whatisadvantageofcategories?Whatisdifferencebetweenimplementingacategoryandinheritance?

類別的作用?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?

答案:category

可以在不獲悉,不改變本來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。

并且假如類別和本來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋本來的方法,由于類別具有更高的優(yōu)先級(jí)。

類別重要有3個(gè)作用:

(1)將類的實(shí)現(xiàn)分散到多個(gè)不同文獻(xiàn)或多個(gè)不同框架中。

(2)創(chuàng)建對(duì)私有方法的前向引用。

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

繼承可以增長,修改或者刪除方法,并且可以增長屬性。25.Differencebetweencategoriesandextensions?

類別和類擴(kuò)展的區(qū)別。

答案:category和extensions的不同在于

后者可以添加屬性。此外后者添加的方法是必須要實(shí)現(xiàn)的。

extensions可以認(rèn)為是一個(gè)私有的Category。26.Differencebetweenprotocolinobjectivecandinterfacesinjava?

oc中的協(xié)議和java中的接口概念有何不同?

答案:OC中的代理有2層含義,官方定義為

formal和informalprotocol。前者和Java接口同樣。

informalprotocol中的方法屬于設(shè)計(jì)模式考慮范疇,不是必須實(shí)現(xiàn)的,但是假如有實(shí)現(xiàn),就會(huì)改變類的屬性。

其實(shí)關(guān)于正式協(xié)議,類別和非正式協(xié)議我很早前學(xué)習(xí)的時(shí)候大體看過,也寫在了學(xué)習(xí)教程里

“非正式協(xié)議概念其實(shí)就是類別的另一種表達(dá)方式“這里有一些你也許希望實(shí)現(xiàn)的方法,你可以使用他們更好的完畢工作”。

這個(gè)意思是,這些是可選的。比如我門要一個(gè)更好的方法,我們就會(huì)申明一個(gè)這樣的類別去實(shí)現(xiàn)。然后你在后期可以直接使用這些更好的方法。

這么看,總覺得類別這玩意兒有點(diǎn)像協(xié)議的可選協(xié)議。"

現(xiàn)在來看,其實(shí)protocal已經(jīng)開始對(duì)兩者都統(tǒng)一和規(guī)范起來操作,由于資料中說“非正式協(xié)議使用interface修飾“,

現(xiàn)在我們看到協(xié)議中兩個(gè)修飾詞:“必須實(shí)現(xiàn)(@requied)”和“可選實(shí)現(xiàn)(@optional)”。26WhatareKVOandKVC?

答案:kvc:鍵

-

值編碼是一種間接訪問對(duì)象的屬性使用字符串來標(biāo)記屬性,而不是通過調(diào)用存取方法,直接或通過實(shí)例變量訪問的機(jī)制。

很多情況下可以簡化程序代碼。apple文檔其實(shí)給了一個(gè)很好的例子。

kvo:鍵值觀測(cè)機(jī)制,他提供了觀測(cè)某一屬性變化的方法,極大的簡化了代碼。

具體用看到嗯哼用到過的一個(gè)地方是對(duì)于按鈕點(diǎn)擊變化狀態(tài)的的監(jiān)控。

比如我自定義的一個(gè)button

[cpp]

[selfaddObserver:selfforKeyPath:@"highlighted"options:0context:nil];

#pragmamarkKVO

-(void)observeValueForKeyPath:(NSString*)keyPathofObject:(id)objectchange:(NSDictionary*)changecontext:(void*)context

{

if([keyPathisEqualToString:@"highlighted"]){

[selfsetNeedsDisplay];

}

}

對(duì)于系統(tǒng)是根據(jù)keypath去取的到相應(yīng)的值發(fā)生改變,理論上來說是和kvc機(jī)制的道理是同樣的。

對(duì)于kvc機(jī)制如何通過key尋找到value:

“當(dāng)通過KVC調(diào)用對(duì)象時(shí),比如:[selfvalueForKey:@”someKey”]時(shí),程序會(huì)自動(dòng)試圖通過幾種不同的方式解析這個(gè)調(diào)用。一方面查找對(duì)象是否帶有

someKey

這個(gè)方法,假如沒找到,會(huì)繼續(xù)查找對(duì)象是否帶有someKey這個(gè)實(shí)例變量(iVar),假如還沒有找到,程序會(huì)繼續(xù)試圖調(diào)用

-(id)valueForUndefinedKey:這個(gè)方法。假如這個(gè)方法還是沒有被實(shí)現(xiàn)的話,程序會(huì)拋出一個(gè)NSUndefinedKeyException異常錯(cuò)誤。

(注:Key-ValueCoding查找方法的時(shí)候,不僅僅會(huì)查找someKey這個(gè)方法,還會(huì)查找getsomeKey這個(gè)方法,前面加一個(gè)get,或者_(dá)someKey以及_getsomeKey這幾種形式。同時(shí),查找實(shí)例變量的時(shí)候也會(huì)不僅僅查找someKey這個(gè)變量,也會(huì)查找_someKey這個(gè)變量是否存在。)

設(shè)計(jì)valueForUndefinedKey:方法的重要目的是當(dāng)你使用-(id)valueForKey方法從對(duì)象中請(qǐng)求值時(shí),對(duì)象可以在錯(cuò)誤發(fā)生前,有最后的機(jī)會(huì)響應(yīng)這個(gè)請(qǐng)求。這樣做有很多好處,下面的兩個(gè)例子說明了這樣做的好處。“

來至cocoa,這個(gè)說法應(yīng)當(dāng)挺有道理。

由于我們知道button卻是存在一個(gè)highlighted實(shí)例變量.因此為什么上面我們只是add一個(gè)相關(guān)的keypath就行了,27Whatispurposeofdelegates?

代理的作用?

答案:代理的目的是改變或傳遞控制鏈。允許一個(gè)類在某些特定期刻告知到其他類,而不需要獲取到那些類的指針??梢詼p少框架復(fù)雜度。

此外一點(diǎn),代理可以理解為java中的回調(diào)監(jiān)聽機(jī)制的一種類似。28WhataremutableandimmutabletypesinObjectiveC?

oc中可修改和不可以修改類型。

答案:可修改不可修改的集合類。這個(gè)我個(gè)人簡樸理解就是可動(dòng)態(tài)添加修改和不可動(dòng)態(tài)添加修改同樣。

比如NSArray和NSMutableArray。前者在初始化后的內(nèi)存控件就是固定不可變的,后者可以添加等,可以動(dòng)態(tài)申請(qǐng)新的內(nèi)存空間29Whenwecallobjectivecisruntimelanguagewhatdoesitmean?

我們說的oc是動(dòng)態(tài)運(yùn)營時(shí)語言是什么意思?

答案:多態(tài)。重要是將數(shù)據(jù)類型的擬定由編譯時(shí),推遲到了運(yùn)營時(shí)。

這個(gè)問題其實(shí)淺涉及到兩個(gè)概念,運(yùn)營時(shí)和多態(tài)。

簡樸來說,運(yùn)營時(shí)機(jī)制使我們直到運(yùn)營時(shí)才去決定一個(gè)對(duì)象的類別,以及調(diào)用該類別對(duì)象指定方法。

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

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

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

因此也可以說,運(yùn)營時(shí)機(jī)制是多態(tài)的基礎(chǔ)?~~~30whatisdifferencebetweenNSNotificationandprotocol?

告知和協(xié)議的不同之處?

答案:協(xié)議有控制鏈(has-a)的關(guān)系,告知沒有。

一方面我一開始也不太明白,什么叫控制鏈(專業(yè)術(shù)語了~)。但是簡樸分析下告知和代理的行為模式,我們大體可以有自己的理解

簡樸來說,告知的話,它可以一對(duì)多,一條消息可以發(fā)送給多個(gè)消息接受者。

代理按我們的理解,到不是直接說不能一對(duì)多,比如我們知道的明星經(jīng)濟(jì)代理人,很多時(shí)候一個(gè)經(jīng)濟(jì)人負(fù)責(zé)好幾個(gè)明星的事務(wù)。

只是對(duì)于不同明星間,代理的事物對(duì)象都是不同樣的,一一相應(yīng),不也許說明天要解決A明星要一個(gè)發(fā)布會(huì),代理人發(fā)出解決發(fā)布會(huì)的消息后,別稱B的

發(fā)布會(huì)了。但是告知就不同樣,他只關(guān)心發(fā)出告知,而不關(guān)心多少接受到感愛好要解決。

因此控制鏈(has-a從英語單詞大體可以看出,單一擁有和可控制的相應(yīng)關(guān)系。31Whatispushnotification?

什么是推送消息?

答案:太簡樸,不作答~~~~~~~~~~

這是cocoa上的答案。

其實(shí)到不是說太簡樸,只是太泛泛的一個(gè)概念的東西。就好比說,什么是人。

推送告知更是一種技術(shù)。

簡樸點(diǎn)就是客戶端獲取資源的一種手段。

普通情況下,都是客戶端積極的pull。

推送則是服務(wù)器端積極push。32.Polymorphism?

關(guān)于多態(tài)性

答案:多態(tài),子類指針可以賦值給父類。

這個(gè)題目其實(shí)可以出到一切面向?qū)ο笳Z言中,

因此關(guān)于多態(tài),繼承和封裝基本最佳都有個(gè)自我意識(shí)的理解,也并非一定要把書上資料上寫的能背出來。

最重要的是轉(zhuǎn)化成自我理解。33Whatisresponderchain?

說說響應(yīng)鏈

答案:事件響應(yīng)鏈。涉及點(diǎn)擊事件,畫面刷新事件等。在視圖棧內(nèi)從上至下,或者從下之上傳播。

可以說點(diǎn)事件的分發(fā),傳遞以及解決。具體可以去看下touch事件這塊。由于問的太抽象化了

嚴(yán)重懷疑題目出到越后面就越籠統(tǒng)。34Differencebetweenframeandbounds?

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))35.Differencebetweenmethodandselector?

方法和選擇器有何不同?

答案:selector是一個(gè)方法的名字,method是一個(gè)組合體,包含了名字和實(shí)現(xiàn).36NSOperationqueue?

答案:存放NSOperation的集合類。

操作和操作隊(duì)列,基本可以當(dāng)作java中的線程和線程池的概念。用于解決ios多線程開發(fā)的問題。

網(wǎng)上部分資料提到一點(diǎn)是,雖然是queue,但是卻并不是帶有隊(duì)列的概念,放入的操作并非是按照嚴(yán)格的先進(jìn)現(xiàn)出。

這邊又有個(gè)疑點(diǎn)是,對(duì)于隊(duì)列來說,先進(jìn)先出的概念是Afunc添加進(jìn)隊(duì)列,Bfunc緊跟著也進(jìn)入隊(duì)列,Afunc先執(zhí)行這個(gè)是必然的,

但是Bfunc是等Afunc完全操作完以后,B才開始啟動(dòng)并且執(zhí)行,因此隊(duì)列的概念離亂上有點(diǎn)違反了多線程解決這個(gè)概念。

但是轉(zhuǎn)念一想其實(shí)可以參考銀行的取票和叫號(hào)系統(tǒng)。

因此對(duì)于A比B先排隊(duì)取票但是B率先執(zhí)行完操作,我們亦然可以感性認(rèn)為這還是一個(gè)隊(duì)列。

但是后來看到一票關(guān)于這操作隊(duì)列話題的文章,其中有一句提到

“由于兩個(gè)操作提交的時(shí)間間隔很近,線程池中的線程,誰先啟動(dòng)是不定的。”

瞬間覺得這個(gè)queue名字有點(diǎn)忽悠人了,還不如pool~

綜合一點(diǎn),我們知道他可以比較大的用處在于可以幫組多線程編程就好了。37Whatislazyloading?

答案:懶漢模式,只在用到的時(shí)候才去初始化。

也可以理解成延時(shí)加載。

我覺得最佳也最簡樸的一個(gè)列子就是tableView中圖片的加載顯示了。

一個(gè)延時(shí)載,避免內(nèi)存過高,一個(gè)異步加載,避免線程堵塞。38Canweusetwotableviewcontrollersononeviewcontroller?

是否在一個(gè)視圖控制器中嵌入兩個(gè)tableview控制器?

答案:一個(gè)視圖控制只提供了一個(gè)View視圖,理論上一個(gè)tableViewController也不能放吧,

只能說可以嵌入一個(gè)tableview視圖。當(dāng)然,題目自身也有歧義,假如不是我們定性思維認(rèn)為的UIViewController,

而是宏觀的表達(dá)視圖控制者,那我們倒是可以把其當(dāng)作一個(gè)視圖控制者,它可以控制多個(gè)視圖控制器,比如TabbarController

那樣的感覺。39Canweuseonetableviewwithtwodifferentdatasources?Howyouwillachievethis?

一個(gè)tableView是否可以關(guān)聯(lián)兩個(gè)不同的數(shù)據(jù)源?你會(huì)怎么解決?

答案:一方面我們從代碼來看,數(shù)據(jù)源如何關(guān)聯(lián)上的,其實(shí)是在數(shù)據(jù)源關(guān)聯(lián)的代理方法里實(shí)現(xiàn)的。

因此我們并不關(guān)心如何去關(guān)聯(lián)他,他怎么關(guān)聯(lián)上,方法只是讓我返回根據(jù)自己的需要去設(shè)立如相關(guān)的數(shù)據(jù)源。

因此,我覺得可以設(shè)立多個(gè)數(shù)據(jù)源啊,但是有個(gè)問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數(shù)據(jù)源分區(qū)塊顯示?40id、nil代表什么?id和void*并非完全同樣。在上面的代碼中,id是指向structobjc_object的一個(gè)指針,這個(gè)意思基本上是說,id是一個(gè)指向任何一個(gè)繼承了Object(或者NSObject)類的對(duì)象。需要注意的是id是一個(gè)指針,所以你在使用id的時(shí)候不需要加星號(hào)。比如idfoo=nil定義了一個(gè)nil指針,這個(gè)指針指向NSObject的一個(gè)任意子類。而id*foo=nil則定義了一個(gè)指針,這個(gè)指針指向另一個(gè)指針,被指向的這個(gè)指針指向NSObject的一個(gè)子類。nil和C語言的NULL相同,在objc/objc.h中定義。nil表達(dá)一個(gè)Objctive-C對(duì)象,這個(gè)對(duì)象的指針指向空(沒有東西就是空)。首字母大寫的Nil和nil有一點(diǎn)不同樣,Nil定義一個(gè)指向空的類(是Class,而不是對(duì)象)。SEL是“selector”的一個(gè)類型,表達(dá)一個(gè)方法的名字Method(我們常說的方法)表達(dá)一種類型,這種類型與selector和實(shí)現(xiàn)(implementation)相關(guān)IMP定義為

id

(*IMP)(id,

SEL,…)。這樣說來,

IMP是一個(gè)指向函數(shù)的指針,這個(gè)被指向的函數(shù)涉及id(“self”指針),調(diào)用的SEL(方法名),再加上一些其他參數(shù).說白了IMP就是實(shí)現(xiàn)方法。41層和UIView的區(qū)別是什么?答:兩者最大的區(qū)別是,圖層不會(huì)直接渲染到屏幕上,UIView是iOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都是繼承自它。它自身完全是由CoreAnimation來實(shí)現(xiàn)的。它真正的繪圖部分,是由一個(gè)CALayer類來管理。UIView自身更像是一個(gè)CALayer的管理器。一個(gè)UIView上可以有n個(gè)CALayer,每個(gè)layer顯示一種東西,增強(qiáng)UIView的展現(xiàn)能力。42GCD為GrandCentralDispatch的縮寫。GrandCentralDispatch(GCD)是Apple開發(fā)的一個(gè)多核編程的較新的解決方法。在MacOSX10.6雪豹中初次推出,并在最近引入到了iOS4.0。GCD是一個(gè)替代諸如NSThread等技術(shù)的很高效和強(qiáng)大的技術(shù)。GCD完全可以解決諸如數(shù)據(jù)鎖定和資源泄漏等復(fù)雜的異步編程問題。GCD可以完畢很多事情,但是這里僅關(guān)注在iOS應(yīng)用中實(shí)現(xiàn)多線程所需的一些基礎(chǔ)知識(shí)。在開始之前,需要理解是要提供應(yīng)GCD隊(duì)列的是代碼塊,用于在系統(tǒng)或者用戶創(chuàng)建的的隊(duì)列上調(diào)度運(yùn)營。聲明一個(gè)隊(duì)列如下會(huì)返回一個(gè)用戶創(chuàng)建的隊(duì)列:dispatch_queue_tmyQueue=dispatch_queue_create("com.iphonedevblog.post",NULL);其中,第一個(gè)參數(shù)是標(biāo)記隊(duì)列的,第二個(gè)參數(shù)是用來定義隊(duì)列的參數(shù)(目前不支持,因此傳入NULL)。執(zhí)行一個(gè)隊(duì)列如下會(huì)異步執(zhí)行傳入的代碼:dispatch_async(myQueue,^{[selfdoSomething];});其中,一方面?zhèn)魅胫皠?chuàng)建的隊(duì)列,然后提供由隊(duì)列運(yùn)營的代碼塊。聲明并執(zhí)行一個(gè)隊(duì)列假如不需要保存要運(yùn)營的隊(duì)列的引用,可以通過如下代碼實(shí)現(xiàn)之前的功能:dispatch_async(dispatch_queue_create("com.iphonedevblog.post",NULL),^{[selfdoSomething];});假如需要暫停一個(gè)隊(duì)列,可以調(diào)用如下代碼。暫停一個(gè)隊(duì)列會(huì)阻止和該隊(duì)列相關(guān)的所有代碼運(yùn)營。dispatch_suspend(myQueue);暫停一個(gè)隊(duì)列

假如暫停一個(gè)隊(duì)列不要忘掉恢復(fù)。暫停和恢復(fù)的操作和內(nèi)存管理中的retain和release類似。調(diào)用dispatch_suspend會(huì)增長暫停計(jì)數(shù),而dispatch_resume則會(huì)減少。隊(duì)列只有在暫停計(jì)數(shù)變成零的情況下才開始運(yùn)營。dispatch_resume(myQueue);恢復(fù)一個(gè)隊(duì)列從隊(duì)列中在主線程運(yùn)營代碼有些操作無法在異步隊(duì)列運(yùn)營,因此必須在主線程(每個(gè)應(yīng)用都有一個(gè))上運(yùn)營。UI繪圖以及任何對(duì)NSNotificationCenter的調(diào)用必須在主線程長進(jìn)行。在另一個(gè)隊(duì)列中訪問主線程并運(yùn)營代碼的示例如下:dispatch_sync(dispatch_get_main_queue(),^{[selfdismissLoginWindow];});注意,dispatch_suspend

(以及dispatch_resume)在主線程上不起作用。使用GCD,可以讓你的程序不會(huì)失去響應(yīng).

多線程不容易使用,用了GCD,會(huì)讓它變得簡樸。你無需專門進(jìn)行線程管理,

很棒!dispatch_queue_t

t1=dispatch_queue_create("1",

NULL);

dispatch_queue_t

t2=dispatch_queue_create("2",

NULL);

dispatch_async(t1,^{

[self

print1];

});

dispatch_async(t2,^{

[self

print2];

});43Provider是指某個(gè)iPhone軟件的Push服務(wù)器,這篇文章我將使用.net作為Provider。

APNS

是ApplePushNotificationService(ApplePush服務(wù)器)的縮寫,是蘋果的服務(wù)器。上圖可以分為三個(gè)階段。第一階段:.net應(yīng)用程序把要發(fā)送的消息、目的iPhone的標(biāo)記打包,發(fā)給APNS。

第二階段:APNS在自身的已注冊(cè)Push服務(wù)的iPhone列表中,查找有相應(yīng)標(biāo)記的iPhone,并把消息發(fā)到iPhone。

第三階段:iPhone把發(fā)來的消息傳遞給相應(yīng)的應(yīng)用程序,并且按照設(shè)定彈出Push告知。

//消息推送機(jī)制看內(nèi)存泄露時(shí)候:在搜索中搜索run

找到RunStaticSnalyzer.44.可擴(kuò)展標(biāo)記語言extensiblemarkuplanguage;XML2.用于標(biāo)記電子文獻(xiàn)使其具有結(jié)構(gòu)性的標(biāo)記語言,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對(duì)自己的標(biāo)記語言進(jìn)行定義的源語言。3,數(shù)據(jù)庫提供了更強(qiáng)有力的數(shù)據(jù)存儲(chǔ)和分析能力,例如:數(shù)據(jù)索引、排序、查找、相關(guān)一致性等,XML僅僅是存儲(chǔ)數(shù)據(jù)。4.XML與HTML的設(shè)計(jì)區(qū)別是:XML的核心是數(shù)據(jù),其重點(diǎn)是數(shù)據(jù)的內(nèi)容。而HTML

被設(shè)計(jì)用來顯示數(shù)據(jù),其重點(diǎn)是數(shù)據(jù)的顯示。5.XML和HTML語法區(qū)別:HTML的標(biāo)記不是所有的都需要成對(duì)出現(xiàn),XML則規(guī)定所有的標(biāo)記必須成對(duì)出現(xiàn);HTML標(biāo)記不區(qū)分大小寫,XML則大小敏感,即區(qū)分大小寫。

結(jié)合XML的簡樸使其易于在任何應(yīng)用程序中讀寫數(shù)據(jù),這使XML不久成為數(shù)據(jù)互換的唯一公共語言,雖然不同的應(yīng)用軟件也支持其它的數(shù)據(jù)互換格式,但不久之后他們都將支持XML,那就意味著程序可以更容易的與Windows,MacOS,Linux以及其他平臺(tái)下產(chǎn)生的信息結(jié)合,然后可以很容易加載XML數(shù)據(jù)到程序中并分析他,并以XML格式輸出結(jié)果。XML去掉了之前令許多開發(fā)人員頭疼的SGML(標(biāo)準(zhǔn)通用標(biāo)記語言)的隨意語法。在XML中,采用了如下的語法:1

任何的起始標(biāo)簽都必須有一個(gè)結(jié)束標(biāo)簽。2

可以采用另一種簡化語法,可以在一個(gè)標(biāo)簽中同時(shí)表達(dá)起始和結(jié)束標(biāo)簽。這種語法是在大于符號(hào)之前緊跟一個(gè)斜線(/),例如<tag/>。XML解析器會(huì)將其翻譯成<tag></tag>。3

標(biāo)簽必須按合適的順序進(jìn)行嵌套,所以結(jié)束標(biāo)簽必須按鏡像順序匹配起始標(biāo)簽,例如thisisasamplestring。這好比是將起始和結(jié)束標(biāo)簽看作是數(shù)學(xué)中的左右括號(hào):在沒有關(guān)閉所有的內(nèi)部括號(hào)之前,是不能關(guān)閉外面的括號(hào)的。4

所有的特性都必須有值。5

所有的特性都必須在值的周邊加上雙引號(hào)。45unionu{doublea;intb;};

unionu2{chara[13];intb;};

unionu3{chara[13];charb;};

cout<<sizeof(u)<<endl;//8cout<<sizeof(u2)<<endl;//16cout<<sizeof(u3)<<endl;//13

都知道union的大小取決于它所有的成員中,占用空間最大的一個(gè)成員的大小。所以對(duì)于u來說,大小就是最大的double類型成員a了,所以

sizeof(u)=sizeof(double)=8。但是對(duì)于u2和u3,最大的空間都是char[13]類型的數(shù)組,為什么u3的大小是13,而

u2是16呢?關(guān)鍵在于u2中的成員intb。由于int類型成員的存在,使u2的對(duì)齊方式變成4,也就是說,u2的大小必須在4的對(duì)界上,所以占用的空間變成了16(最接近13的對(duì)界)。

structs1{chara;doubleb;intc;chard;

};

structs2{chara;charb;intc;doubled;};

cout<<sizeof(s1)<<endl;//24cout<<sizeof(s2)<<endl;//16

同樣是兩個(gè)char類型,一個(gè)int類型,一個(gè)double類型,但是由于對(duì)界問題,導(dǎo)致他們的大小不同。計(jì)算結(jié)構(gòu)體大小可以采用元素?cái)[放法,我舉例子說明一下:一方面,CPU判斷結(jié)構(gòu)體的對(duì)界,根據(jù)上一節(jié)的結(jié)論,s1和s2的對(duì)界都取最大的元素類型,也就是double類型的對(duì)界8。然后開始擺放每個(gè)元素。

對(duì)于s1,一方面把a(bǔ)放到8的對(duì)界,假定是0,此時(shí)下一個(gè)空閑的地址是1,但是下一個(gè)元素d是double類型,要放到8的對(duì)界上,離1最接近的地址是8了,所以d被放在了8,此時(shí)下一個(gè)空閑地址變成了16,下一個(gè)元素c的對(duì)界是4,16可以滿足,所以c放在了16,此時(shí)下一個(gè)空閑地址變成了20,下一個(gè)元素d需要對(duì)界1,也正好落在對(duì)界上,所以d放在了20,結(jié)構(gòu)體在地址21處結(jié)束。由于s1的大小需要是8的倍數(shù),所以21-23的空間被保存,s1的大小變成了24。

對(duì)于s2,一方面把a(bǔ)放到8的對(duì)界,假定是0,此時(shí)下一個(gè)空閑地址是1,下一個(gè)元素的對(duì)界也是1,所以b擺放在1,下一個(gè)空閑地址變成了2;下一個(gè)元素c的對(duì)界是4,所以取離2最近的地址4擺放c,下一個(gè)空閑地址變成了8,下一個(gè)元素d的對(duì)界是

8,所以d擺放在8,所有元素?cái)[放完畢,結(jié)構(gòu)體在15處結(jié)束,占用總空間為16,正好是8的倍數(shù)。46ASIDownloadCache

設(shè)立下載緩存它對(duì)Get請(qǐng)求的響應(yīng)數(shù)據(jù)進(jìn)行緩存(被緩存的數(shù)據(jù)必需是成功的200請(qǐng)求):[ASIHTTPRequestsetDefaultCache:[ASIDownloadCachesharedCache]];當(dāng)設(shè)立緩存策略后,所有的請(qǐng)求都被自動(dòng)的緩存起來。此外,假如僅僅希望某次請(qǐng)求使用緩存操作,也可以這樣使用:ASIHTTPRequest*request=[ASIHTTPRequestrequestWithURL:url];[requestsetDownloadCache:[ASIDownloadCachesharedCache]];緩存存儲(chǔ)方式你可以設(shè)立緩存的數(shù)據(jù)需要保存多長時(shí)間,ASIHTTPRequest提供了兩種策略:a,ASICacheForSessionDurationCacheStoragePolicy,默認(rèn)策略,基于session的緩存數(shù)據(jù)存儲(chǔ)。當(dāng)下次運(yùn)營或[ASIHTTPRequestclearSession]時(shí),緩存將失效。b,ASICachePermanentlyCacheStoragePolicy,把緩存數(shù)據(jù)永久保存在本地,如:ASIHTTPRequest*request=[ASIHTTPRequestrequestWithURL:url];[requestsetCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];47HTTP協(xié)議詳解HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡捷、快速的方式,合用于分布式超媒體信息系統(tǒng)。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規(guī)范化工作正在進(jìn)行之中。

http(超文本傳輸協(xié)議)是一個(gè)基于請(qǐng)求與響應(yīng)模式的、無狀態(tài)的、應(yīng)用層的協(xié)議,?;赥CP的連接方式,HTTP1.1版本中給出一種連續(xù)連接的機(jī)制,絕大多數(shù)的Web開發(fā),都是構(gòu)建在HTTP協(xié)議之上的Web應(yīng)用。

HTTP協(xié)議的重要特點(diǎn)可概括如下:

1.支持客戶/服務(wù)器模式。

2.簡樸快速:客戶向服務(wù)器請(qǐng)求服務(wù)時(shí),只需傳送請(qǐng)求方法和途徑。請(qǐng)求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP協(xié)議簡樸,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度不久。

3.靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對(duì)象。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。

4.無連接:無連接的含義是限制每次連接只解決一個(gè)請(qǐng)求。服務(wù)器解決完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。

5.無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對(duì)于事務(wù)解決沒有記憶能力。缺少狀態(tài)意味著假如后續(xù)解決需要前面的信息,則它必須重傳,這樣也許導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。48URLHTTPURL(URL是一種特殊類型的URI是他的子類,包含了用于查找某個(gè)資源的足夠的信息)的格式如下:

錯(cuò)誤!超鏈接引用無效。]

http表達(dá)要通過HTTP協(xié)議來定位網(wǎng)絡(luò)資源;host表達(dá)合法的Internet主機(jī)域名或者IP地址;port指定一個(gè)端標(biāo)語,為空則使用缺省端口80;abs_path指定請(qǐng)求資源的URI;假如URL中沒有給出abs_path,那么當(dāng)它作為請(qǐng)求URI時(shí),必須以“/”的形式給出,通常這個(gè)工作瀏覽器自動(dòng)幫我們完畢。49TCP/UDP區(qū)別聯(lián)系TCP---傳輸控制協(xié)議,提供的是面向連接、可靠的字節(jié)流服務(wù)。當(dāng)客戶和服務(wù)器彼此互換數(shù)據(jù)前,必須先在雙方之間建立一個(gè)TCP連接,之后才干傳輸數(shù)據(jù)。TCP提供超時(shí)重發(fā),丟棄反復(fù)數(shù)據(jù),檢查數(shù)據(jù),流量控制等功能,保證數(shù)據(jù)能從一端傳到另一端。

UDP---用戶數(shù)據(jù)報(bào)協(xié)議,是一個(gè)簡樸的面向數(shù)據(jù)報(bào)的運(yùn)送層協(xié)議。UDP不提供可靠性,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去,但是并不能保證它們能到達(dá)目的地。由于UDP在傳輸數(shù)據(jù)報(bào)前不用在客戶和服務(wù)器之間建立一個(gè)連接,且沒有超時(shí)重發(fā)等機(jī)制,故而傳輸速度不久

TCP(TransmissionControlProtocol,傳輸控制協(xié)議)是基于連接的協(xié)議,也就是說,在正式收發(fā)數(shù)據(jù)前,必須和對(duì)方建立可靠的連接。一個(gè)TCP連接必須要通過三次“對(duì)話”才干建立起來,我們來看看這三次對(duì)話的簡樸過程:1.主機(jī)A向主機(jī)B發(fā)出連接請(qǐng)求數(shù)據(jù)包;2.主機(jī)B向主機(jī)A發(fā)送批準(zhǔn)連接和規(guī)定同步(同步就是兩臺(tái)主機(jī)一個(gè)在發(fā)送,一個(gè)在接受,協(xié)調(diào)工作)的數(shù)據(jù)包;3.主機(jī)A再發(fā)出一個(gè)數(shù)據(jù)包確認(rèn)主機(jī)B的規(guī)定同步:“我現(xiàn)在就發(fā),你接著吧!”,這是第三次對(duì)話。三次“對(duì)話”的目的是使數(shù)據(jù)包的發(fā)送和接受同步,通過三次“對(duì)話”之后,主機(jī)A才向主機(jī)B正式發(fā)送數(shù)據(jù)。

UDP(UserDataProtocol,用戶數(shù)據(jù)報(bào)協(xié)議)是與TCP相相應(yīng)的協(xié)議。它是面向非連接的協(xié)議,它不與對(duì)方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過去!

UDP合用于一次只傳送少量數(shù)據(jù)、對(duì)可靠性規(guī)定不高的應(yīng)用環(huán)境。

tcp協(xié)議和udp協(xié)議的差別

是否連接面向連接面向非連接

傳輸可靠性可靠不可靠

應(yīng)用場(chǎng)合傳輸大量數(shù)據(jù)少量數(shù)據(jù)

速度慢快50socket連接和http連接的區(qū)別簡樸說,你瀏覽的網(wǎng)頁(網(wǎng)址以http://開頭)都是http協(xié)議傳輸?shù)侥愕臑g覽器的,

而http是基于socket之上的。socket是一套完畢tcp,udp協(xié)議的接口。HTTP協(xié)議:簡樸對(duì)象訪問協(xié)議,相應(yīng)于應(yīng)用層

,HTTP協(xié)議是基于TCP連接的tcp協(xié)議:

相應(yīng)于傳輸層ip協(xié)議:

相應(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),通過Socket,我們才干使用TCP/IP協(xié)議。http連接:http連接就是所謂的短連接,即客戶端向服務(wù)器端發(fā)送一次請(qǐng)求,服務(wù)器端響應(yīng)后連接即會(huì)斷掉;socket連接:socket連接就是所謂的長連接,理論上客戶端和服務(wù)器端一旦建立起連接將不會(huì)積極斷掉;但是由于各種環(huán)境因素也許會(huì)是連接斷開,比如說:服務(wù)器端或客戶端主機(jī)down了,網(wǎng)絡(luò)故障,或者兩者之間長時(shí)間沒有數(shù)據(jù)傳輸,網(wǎng)絡(luò)防火墻也許會(huì)斷開該連接以釋放網(wǎng)絡(luò)資源。所以當(dāng)一個(gè)socket連接中沒有數(shù)據(jù)的傳輸,那么為了維持連接需要發(fā)送心跳消息~~具體心跳消息格式是開發(fā)者自己定義的我們已經(jīng)知道網(wǎng)絡(luò)中的進(jìn)程是通過socket來通信的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲學(xué)之一就是“一切皆文獻(xiàn)”,都可以用“打開open–>

讀寫write/read–>

關(guān)閉close”模式來操作。我的理解就是Socket就是該模式的一個(gè)實(shí)現(xiàn),socket即是一種特殊的文獻(xiàn),一些socket函數(shù)就是對(duì)其進(jìn)行的操作(讀/寫IO、打開、關(guān)閉),這些函數(shù)我們?cè)诤竺孢M(jìn)行介紹。我們?cè)趥鬏敂?shù)據(jù)時(shí),可以只使用(傳輸層)TCP/IP協(xié)議,但是那樣的話,假如沒有應(yīng)用層,便無法辨認(rèn)數(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是轎車,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力。)

2)Socket是對(duì)TCP/IP協(xié)議的封裝,Socket自身并不是協(xié)議,而是一個(gè)調(diào)用接口(API),通過Socket,我們才干使用TCP/IP協(xié)議。Socket的出現(xiàn)只是使得程序員更方便地使用TCP/IP協(xié)議棧而已,是對(duì)TCP/IP協(xié)議的抽象,從而形成了我們知道的一些最基本的函數(shù)接口。51什么是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),完畢三次握手。握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)。抱負(fù)狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方積極關(guān)閉連接之前,TCP

連接都將被一直保持下去。斷開連接時(shí)服務(wù)器和客戶端均可以積極發(fā)起斷開TCP連接的請(qǐng)求,斷開過程需要通過“四次握手”(過程就不細(xì)寫了,就是服務(wù)器和客戶端交互,最終擬定斷開)52運(yùn)用Socket建立網(wǎng)絡(luò)連接的環(huán)節(jié)建立Socket連接至少需要一對(duì)套接字,其中一個(gè)運(yùn)營于客戶端,稱為ClientSocket

,另一個(gè)運(yùn)營于服務(wù)器端,稱為ServerSocket

。套接字之間的連接過程分為三個(gè)環(huán)節(jié):服務(wù)器監(jiān)聽,客戶端請(qǐng)求,連接確認(rèn)。1。服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字,而是處在等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài),等待客戶端的連接請(qǐng)求。2??蛻舳苏?qǐng)求:指客戶端的套接字提出連接請(qǐng)求,要連接的目的是服務(wù)器端的套接字。為此,客戶端的套接字必須一方面描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端標(biāo)語,然后就向服務(wù)器端套接字提出連接請(qǐng)求。3。連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接受到客戶端套接字的連接請(qǐng)求時(shí),就響應(yīng)客戶端套接字的請(qǐng)求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,雙方就正式建立連接。而服務(wù)器端套接字繼續(xù)處在監(jiān)聽狀態(tài),繼續(xù)接受其他客戶端套接字的連接請(qǐng)求。53進(jìn)程與線程進(jìn)程(process)是一塊包含了某些資源的內(nèi)存區(qū)域。操作系統(tǒng)運(yùn)用進(jìn)程把它的工作劃分為一些功能單元。進(jìn)程中所包含的一個(gè)或多個(gè)執(zhí)行單元稱為線程(thread)。進(jìn)程還擁有一個(gè)私有的虛擬地址空間,該空間僅能被它所包含的線程訪問。通常在一個(gè)進(jìn)程中可以包含若干個(gè)線程,它們可以運(yùn)用進(jìn)程所擁有的資源。在引入線程的操作系統(tǒng)中,通常都是把進(jìn)程作為分派資源的基本單位,而把線程作為獨(dú)立運(yùn)營和獨(dú)立調(diào)度的基本單位。由于線程比進(jìn)程更小,基本上不擁有系統(tǒng)資源,故對(duì)它的調(diào)度所付出的開銷就會(huì)小得多,能更高效的提高系統(tǒng)內(nèi)多個(gè)程序間并發(fā)執(zhí)行的限度。簡而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.一個(gè)程序就是一個(gè)進(jìn)程,而一個(gè)程序中的多個(gè)任務(wù)則被稱為線程。

線程只能歸屬于一個(gè)進(jìn)程并且它只能訪問該進(jìn)程所擁有的資源。當(dāng)操作系統(tǒng)創(chuàng)建一個(gè)進(jìn)程后,該進(jìn)程會(huì)自動(dòng)申請(qǐng)一個(gè)名為主線程或首要線程的線程。應(yīng)用程序(application)是由一個(gè)或多個(gè)互相協(xié)作的進(jìn)程組成的。此外,進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)營效率。

線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)營的入口、順序執(zhí)行序列和程序的出口。但是線程不可以獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。

從邏輯角度來看,多線程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分派。這就是進(jìn)程和線程的重要區(qū)別。進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)營活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分派和調(diào)度的一個(gè)獨(dú)立單位.

線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)營的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)營中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的所有資源.

一個(gè)線程可以創(chuàng)建和撤消另一個(gè)線程;同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行.54多線程多線程編程是防止主線程堵塞,增長運(yùn)營效率等等的最佳方法。而原始的多線程方法存在很多的毛病,涉及線程鎖死等。在Cocoa中,Apple提供了NSOperation這個(gè)類,提供了一個(gè)優(yōu)秀的多線程編程方法。本次介紹NSOperation的子集,簡易方法的NSInvocationOperation:

一個(gè)NSOperationQueue

操作隊(duì)列,就相稱于一個(gè)線程管理器,而非一個(gè)線程。由于你可以設(shè)立這個(gè)線程管理器內(nèi)可以并行運(yùn)營的的線程數(shù)量等等55oc語法里的@perpoerty不用寫@synzhesize了,自動(dòng)填充了。并且的_name;寫方法時(shí)候不用提前聲明。llvm

全局方法便利。枚舉類型。enumhello:Integer{

}

冒號(hào)后面直接可以跟類型,以前是:enumhello{}

后面在指定為Integer.橋接。ARC

自動(dòng)releaseretain

的時(shí)候

CFStringCFArray.CoreFountion.

加上橋接_brige

才干區(qū)分CFString

和NSString

而現(xiàn)在自動(dòng)區(qū)分了,叫固定橋接。

下拉刷新封裝好了。UICollectionViewController.

可以把表格提成多列。

SocialFramework(社交集成)UIActivityViewController來詢問用戶的社交行為

緩存:就是存放在臨時(shí)文獻(xiàn)里,比如新浪微博請(qǐng)求的數(shù)據(jù),和圖片,下次請(qǐng)求看這里有沒有值。56Singleton(單例模式),也叫單子模式,是一種常用的軟件設(shè)計(jì)模式。在應(yīng)用這個(gè)模式時(shí),單例對(duì)象的類必須保證只有一個(gè)實(shí)例存在。

代碼如下:

staticClassA*classA=nil;//靜態(tài)的該類的實(shí)例

+(ClassA*)sharedManager

@synchronized(self){

if(!classA){

classA=[[superallocWithZone:NULL]init];

}

returnclassA;

}

+(id)allocWithZone:(NSZone*)zone{

return[[selfsharedManager]retain];

}

-(id)copyWithZone:(NSZone*)zone{

returnself;

}

-(id)retain{

returnself;

}

-(NSUIntger)retainCount{

returnNSUIntgerMax;

}

-(onewayvoid)release{

}

-(id)autorelease{

returnself;

}

-(void)dealloc{

}

57請(qǐng)寫一個(gè)C函數(shù),若解決器是Big_endian的,則返回0;若是Little_endian的,則返回1intcheckCPU(){

{

unionw

{

inta;

charb;

}c;

c.a=1;

return

(c.b==1);

}

}

剖析:嵌入式系統(tǒng)開發(fā)者應(yīng)當(dāng)對(duì)Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU對(duì)操作數(shù)的存放方式是從低字節(jié)到高字節(jié),

Big-endian

模式的CPU對(duì)操作數(shù)的存放方式是從高字節(jié)到低字節(jié)。在弄清楚這個(gè)之前要弄清楚這個(gè)問題:字節(jié)從右到坐為從高到低!

假設(shè)從地址0x4000開始存放:0x12345678,是也個(gè)32位四個(gè)字節(jié)的數(shù)據(jù),最高字節(jié)是0x12,最低字節(jié)是0x78:在Little-endian模式CPU內(nèi)存中的存放方式為:

(高字節(jié)在高地址,

低字節(jié)在低地址)

內(nèi)存地址0x40000x40010x40020x4003

存放內(nèi)容

0x780x560x340x12

大端機(jī)則相反。

有的解決器系統(tǒng)采用了小端方式進(jìn)行數(shù)據(jù)存放,如Intel的奔騰。有的解決器系統(tǒng)采用了大端方式進(jìn)行數(shù)據(jù)存放,如IBM半導(dǎo)體和Freescale的PowerPC解決器。不僅對(duì)于解決器,一些外設(shè)的設(shè)計(jì)中也存在著使用大端或者小端進(jìn)行數(shù)據(jù)存放的選擇。因此在一個(gè)解決器系統(tǒng)中,有也許存在大端和小端模式同時(shí)存在的現(xiàn)象。這一現(xiàn)象為系統(tǒng)的軟硬件設(shè)計(jì)帶來了不小的麻煩,這規(guī)定系統(tǒng)設(shè)計(jì)工程師,必須進(jìn)一步理解大端和小端模式的差別。大端與小端模式的差別體現(xiàn)在一個(gè)解決器的寄存器,指令集,系統(tǒng)總線等各個(gè)層次中。

聯(lián)合體union的存放順序是所有成員都從低地址開始存放的。以上是網(wǎng)上的原文。讓我們看看在ARM解決器上union是如何存儲(chǔ)的呢?

地址A----------------|A

|A+1

|A+2

|A+3

|inta;|

|

|

|

--------------------|A

|charb;|

|---------

假如是小端如何存儲(chǔ)c.a的呢?

地址A-----------

-------------------|A

|A+1

|A+2

|A+3|inta;

|0x01|0x00

|0x00

|0x00|-------------------------------------|A

|charb;|

|---------

假如是大端如何存儲(chǔ)c.a的呢?

地址A---------------------

---------|A

|A+1

|A+2

|A+3

|inta;|0x00

|0x00

|0x00

|0x01

|------------------------------------------|A

|charb;|

|---------

現(xiàn)在知道為什么c.b==0的話是大端,c.b==1的話就是小端了吧。58堆和棧上的指針

指針?biāo)赶虻倪@塊內(nèi)存是在哪里分派的,在堆上稱為堆上的指針,在棧上為棧上的指針.

在堆上的指針,可以保存在全局?jǐn)?shù)據(jù)結(jié)構(gòu)中,供不同函數(shù)使用訪問同一塊內(nèi)存.

在棧上的指針,在函數(shù)退出后,該內(nèi)存即不可訪問.

59什么是指針的釋放?

具體來說涉及兩個(gè)概念.

1

釋放該指針指向的內(nèi)存,只有堆上的內(nèi)存才需要我們手工釋放,棧上不需要.

2

將該指針重定向?yàn)镹ULL.

60數(shù)據(jù)結(jié)構(gòu)中的指針?

其實(shí)就是指向一塊內(nèi)存的地址,通過指針傳遞,可實(shí)現(xiàn)復(fù)雜的內(nèi)存訪問.

7

函數(shù)指針?

指向一塊函數(shù)的入口地址.

8

指針作為函數(shù)的參數(shù)?

比如指向一個(gè)復(fù)雜數(shù)據(jù)結(jié)構(gòu)的指針作為函數(shù)變量

這種方法避免整個(gè)復(fù)雜數(shù)據(jù)類型內(nèi)存的壓棧出棧操作,提高效率.

注意:指針自身不可變,但指針指向的數(shù)據(jù)結(jié)構(gòu)可以改變.

9

指向指針的指針?

指針指向的變量是一個(gè)指針,即具體內(nèi)容為一個(gè)指針的值,是一個(gè)地址.

此時(shí)指針指向的變量長度也是4位.

61指針與地址的區(qū)別?

區(qū)別:

1指針意味著已有一個(gè)指針變量存在,他的值是一個(gè)地址,指針變量自身也存放在一個(gè)長度為四個(gè)字節(jié)的地址當(dāng)中,而地址概念自身并不代表有任何變量存在.

2

指針的值,假如沒有限制,通常是可以變化的,也可以指向此外一個(gè)地址.

地址表達(dá)內(nèi)存空間的一個(gè)位置點(diǎn),他是用來賦給指針的,地址自身是沒有大小概念,指針指向變量的大小,取決于地址后面存放的變量類型.

62指針與數(shù)組名的關(guān)系?

其值都是一個(gè)地址,但前者是可以移動(dòng)的,后者是不可變的.

12

如何防止指針的越界使用問題?

必須讓指針指向一個(gè)有效的內(nèi)存地址,

1

防止數(shù)組越界

2

防止向一塊內(nèi)存中拷貝過多的內(nèi)容

3

防止使用空指針

4

防止改變const修改的指針

5

防止改變指向靜態(tài)存儲(chǔ)區(qū)的內(nèi)容

6

防止兩次釋放一個(gè)指針

7

防止使用野指針.

13

指針的類型轉(zhuǎn)換?

指針轉(zhuǎn)換通常是指針類型和void*

類型之前進(jìn)行強(qiáng)制轉(zhuǎn)換,從而與盼望或返回void指針的函數(shù)進(jìn)行對(duì)的的交接.

63static有什么用途?(請(qǐng)至少說明兩種)

1.限制變量的作用域

2.設(shè)立變量的存儲(chǔ)域

7.

引用與指針有什么區(qū)別?

1)

引用必須被初始化,指針不必。

2)

引用初始化以后不能被改變,指針可以改變所指的對(duì)象。

2)

不存在指向空值的引用,但是存在指向空值的指針。

8.

描述實(shí)時(shí)系統(tǒng)的基本特性

在特定期間內(nèi)完畢特定的任務(wù),實(shí)時(shí)性與可靠性64全局變量和局部變量在內(nèi)存中是否有區(qū)別?假如有,是什么區(qū)別?

全局變量儲(chǔ)存在靜態(tài)數(shù)據(jù)庫,局部變量在堆棧

10.

什么是平衡二叉樹?

左右子樹都是平衡二叉樹且左右子樹的深度差值的絕對(duì)值不大于165堆棧溢出一般是由什么因素導(dǎo)致的?

沒有回收垃圾資源

12.

什么函數(shù)不能聲明為虛函數(shù)?

constructor

13.

冒泡排序算法的時(shí)間復(fù)雜度是什么?

O(n^2)

14.

寫出floatx

與“零值”比較的if語句。

if(x>0.000001&&x<-0.000001)

16.Internet采用哪種網(wǎng)絡(luò)協(xié)議?該協(xié)議的重要層次結(jié)構(gòu)?

tcp/ip

應(yīng)用層/傳輸層/網(wǎng)絡(luò)層/數(shù)據(jù)鏈路層/物理層

17.Internet物理地址和IP地址轉(zhuǎn)換采用什么協(xié)議?

ARP(AddressResolutionProtocol)(地址解析協(xié)議)

18.IP地址的編碼

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論