當(dāng)前位置:高考升學(xué)網(wǎng) > 招聘筆試題 > 正文
•; 是的。一個例子是只讀的狀態(tài)寄存器。它是volatile因為它可能被意想不到地改變。它是ct因為程序不應(yīng)該試圖去修改它。
•; 是的。盡管這并不很常見。一個例子是當(dāng)一個中服務(wù)子程序修該一個指向一個buffer的指針時。
static 關(guān)鍵字的作用:
(1)函數(shù)體內(nèi) static 變量的作用范圍為該函數(shù)體,不同于 auto 變量,該變量的內(nèi)存只被分配一次,
因此其值在下次調(diào)用時仍維持上次的值;
(2)在模塊內(nèi)的 static 全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問;
(3)在模塊內(nèi)的 static 函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個函數(shù)的使用范圍被限制在聲明
它的模塊內(nèi);
(4)在類中的 static 成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝;
(5)在類中的 static 成員函數(shù)屬于整個類所擁有,這個函數(shù)不接收 this 指針,因而只能訪問類的static 成員變量。
extern “C” 的作用
(1)被 extern “C”限定的函數(shù)或變量是 extern 類型的;
extern 是 C/C++語言中表明函數(shù)和全局變量作用范圍(可見性)的關(guān)鍵字,該關(guān)鍵字告訴編譯器,
其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。
(2)被 extern “C”修飾的變量和函數(shù)是按照 C 語言方式編譯和連接的;
extern “C”的慣用法
(1)在 C++中引用 C 語言中的函數(shù)和變量,在包含 C 語言頭文件(假設(shè)為 cExample.h)時,需進(jìn)
行下列處理:
extern “C”
{
#include “cExample.h”
}
而在 C 語言的頭文件中,對其外部函數(shù)只能指定為 extern 類型,C 語言中不支持 extern “C”聲明,
在.c 文件中包含了 extern “C”時會出現(xiàn)編譯語法錯誤。
(2)在 C 中引用 C++語言中的函數(shù)和變量時,C++的頭文件需添加 extern “C”,但是在 C 語言中不
能直接引用聲明了 extern “C”的該頭文件,應(yīng)該僅將 C 文件中將 C++中定義的 extern “C”函數(shù)聲明為
extern 類型。
10.為什么標(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ù)引用。
11.#import跟#include的區(qū)別,@class呢?
@class一般用于頭文件中需要聲明該類的某個實例變量的時候用到,在m文件中還是需要使用#import
而#import比起#include的好處就是不會引起交叉編譯
12.MVC模式的理解
MVC 設(shè) 計模式考慮三種對象:模型對象、視圖對象、和控制器對象。模型對象代表特別的知識和專業(yè)技能,它們負(fù)責(zé)保有應(yīng)用程序的數(shù)據(jù)和定義操作數(shù)據(jù)的邏輯。視圖對象 知道如何顯示應(yīng)用程序的模型數(shù)據(jù),而且可能允許用戶對其進(jìn)行編輯?刂破鲗ο笫菓(yīng)用程序的視圖對象和模型對象之間的協(xié)調(diào)者。
13.線程與進(jìn)程的區(qū)別和聯(lián)系?
進(jìn)程和線程都是由操作系統(tǒng)所體會的程序運行的基本單元,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性。
程 和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨立的地址空間,一個進(jìn)程崩潰后,在保護(hù)模式下不會對其它進(jìn)程產(chǎn)生影響,而線程只是一個進(jìn) 程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健 壯,但在進(jìn)程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。
14.列舉幾種進(jìn)程的同步機(jī)制,并比較其優(yōu)缺點。
答案:原子操作 信號量機(jī)制 自旋鎖 管程,會合,分布式系統(tǒng)
進(jìn)程之間通信的途徑
答案:共享存儲系統(tǒng)消息傳遞系統(tǒng)管道:以文件系統(tǒng)為基礎(chǔ)
進(jìn)程死鎖的原因
答案:資源競爭及進(jìn)程推進(jìn)順序非法
死鎖的4個必要條件
答案:互斥、請求保持、不可剝奪、環(huán)路
死鎖的處理
答案:鴕鳥策略、預(yù)防策略、避免策略、檢測與解除死鎖
15.堆和棧的區(qū)別
管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產(chǎn)生memory leak。
申請大。
棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時,將提示overflow。因 此,能從棧獲得的空間較小。
堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。
碎片問題:對于堆來講,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題,因為棧是先進(jìn)后出的隊列,他們是如此的一一對應(yīng),以至于永遠(yuǎn)都不可能有一個內(nèi)存塊從棧中間彈出
分配方式:堆都是動態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動態(tài)分配由alloca函數(shù)進(jìn)行分配,但是棧的動態(tài)分配和堆是不同的,他的動態(tài)分配是由編譯器進(jìn)行釋放,無需我們手工實現(xiàn)。
分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計算機(jī)會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫提供的,它的機(jī)制是很復(fù)雜的。
16.什么是鍵-值,鍵路徑是什么
模型的性質(zhì)是通過一個簡單的鍵(通常是個字符串)來指定的。視圖和控制器通過鍵來查找相應(yīng)的屬性值。在一個給定的實體中,同一個屬性的所有值具有相同的數(shù)據(jù)類型。鍵-值編碼技術(shù)用于進(jìn)行這樣的查找—它是一種間接訪問對象屬性的機(jī)制。
鍵路徑是一個由用點作分隔符的鍵組成的字符串,用于指定一個連接在一起的對象性質(zhì)序列。第一個鍵的
性質(zhì)是由先前的性質(zhì)決定的,接下來每個鍵的值也是相對于其前面的性質(zhì)。鍵路徑使您可以以獨立于模型
實現(xiàn)的方式指定相關(guān)對象的性質(zhì)。通過鍵路徑,您可以指定對象圖中的一個任意深度的路徑,使其指向相
關(guān)對象的特定屬性。
For example, the key path address.streetwould get the value of the address property from the receiving
object, and then determine the street property relative to the address object.
17.c和obj-c如何混用
1)obj-c的編譯器處理后綴為m的文件時,可以識別obj-c和c的代碼,處理mm文件可以識別obj-c,c,c++代碼,但cpp文件必須只能用c/c++代碼,而且cpp文件include的頭文件中,也不能出現(xiàn)obj-c的代碼,因為cpp只是cpp
2) 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是問題
3)在cpp中混用obj-c其實就是使用obj-c編寫的模塊是我們想要的。
如果模塊以類實現(xiàn),那么要按照cpp class的標(biāo)準(zhǔn)寫類的定義,頭文件中不能出現(xiàn)obj-c的東西,包括#import cocoa的。實現(xiàn)文件中,即類的實現(xiàn)代碼中可以使用obj-c的東西,可以import,只是后綴是mm。
如果模塊以函數(shù)實現(xiàn),那么頭文件要按c的格式聲明函數(shù),實現(xiàn)文件中,c++函數(shù)內(nèi)部可以用obj-c,但后綴還是mm或m。
總 結(jié):只要cpp文件和cpp include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關(guān)鍵是使用接口,而不能直接使用實現(xiàn)代碼,實際上cpp混用的是 obj-c編譯后的o文件,這個東西其實是無差別的,所以可以用。obj-c的編譯器支持cpp.
18.目標(biāo)-動作機(jī)制
目標(biāo)是動作消息的接收者。一個控件,或者更為常見的是它的單元,以插座變量(參見”插座變量”部分)
的形式保有其動作消息的目標(biāo)。
動作是控件發(fā)送給目標(biāo)的消息,或者從目標(biāo)的角度看,它是目標(biāo)為了響應(yīng)動作而實現(xiàn)的方法。
程序需要某些機(jī)制來進(jìn)行事件和指令的翻譯。這個機(jī)制就是目標(biāo)-動作機(jī)制。
19.cocoa touch框架
iPhone OS 應(yīng)用程序的基礎(chǔ) Cocoa Touch 框架重用了許多 Mac 系統(tǒng)的成熟模式,但是它更多地專注于觸摸的接口和優(yōu)化。UIKit 為您提供了在 iPhone OS 上實現(xiàn)圖形,事件驅(qū)動程序的基本工具,其建立在和 Mac OS X 中一樣的 Foundation 框架上,包括文件處理,網(wǎng)絡(luò),字符串操作等。
Cocoa Touch 具有和 iPhone 用戶接口一致的特殊設(shè)計。有了 UIKit,您可以使用 iPhone OS 上的獨特的圖形接口控件,按鈕,以及全屏視圖的功能,您還可以使用加速儀和多點觸摸手勢來控制您的應(yīng)用。
各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了創(chuàng)建世界一流 iPhone 應(yīng) 用程序需要的所有框架,從三維圖形,到專業(yè)音效,甚至提供設(shè)備訪問 API 以控制攝像頭,或通過 GPS 獲知當(dāng)前位置。Cocoa Touch 既包含只需要幾行代碼就可以完成全部任務(wù)的強(qiáng)大的 Objective-C 框架,也在需要時提供基礎(chǔ)的 C 語言 API 來直接訪問系統(tǒng)。這些框架包括:
Core Animation
通過 Core Animation,您就可以通過一個基于組合獨立圖層的簡單的編程模型來創(chuàng)建豐富的用戶體驗。
Core Audio
Core Audio 是播放,處理和錄制音頻的專業(yè)技術(shù),能夠輕松為您的應(yīng)用程序添加強(qiáng)大的音頻功能。
Core Data
提供了一個面向?qū)ο蟮臄?shù)據(jù)管理解決方案,它易于使用和理解,甚至可處理任何應(yīng)用或大或小的數(shù)據(jù)模型。
功能列表:框架分類
下面是 Cocoa Touch 中一小部分可用的框架:
音頻和視頻
Core Audio
OpenAL
Media Library
AV Foundation
數(shù)據(jù)管理
Core Data
SQLite
圖形和動畫
Core Animation
OpenGL ES
Quartz 2D
網(wǎng)絡(luò)/li>
Bonjour
WebKit
BSD Sockets
用戶應(yīng)用
Address Book
Core Location
Map Kit
Store Kit
20.objc的內(nèi)存管理
?? 如果您通過分配和初始化(比如[[MyClass alloc] init])的方式來創(chuàng)建對象,您就擁
有這個對象,需要負(fù)責(zé)該對象的釋放。這個規(guī)則在使用NSObject的便利方法new 時也同樣適用。
?? 如果您拷貝一個對象,您也擁有拷貝得到的對象,需要負(fù)責(zé)該對象的釋放。
?? 如果您保持一個對象,您就部分擁有這個對象,需要在不再使用時釋放該對象。
反過來,
?? 如果您從其它對象那里接收到一個對象,則您不擁有該對象,也不應(yīng)該釋放它(這個規(guī)則有少數(shù)
的例外,在參考文檔中有顯式的說明)。
21.自動釋放池是什么,如何工作
當(dāng) 您向一個對象發(fā)送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當(dāng)?shù)膶ο,因此自動釋放池?義的作用域內(nèi)的其它對象可以向它發(fā)送消息。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。
1. ojc-c 是 通過一種”referring counting”(引用計數(shù))的方式來管理內(nèi)存的, 對象在開始分配內(nèi)存(alloc)的時候引用計數(shù)為一,以后每當(dāng)碰到有copy,retain的時候引用計數(shù)都會加一, 每當(dāng)碰到release和autorelease的時候引用計數(shù)就會減一,如果此對象的計數(shù)變?yōu)榱?, 就會被系統(tǒng)銷毀.
2. NSAutoreleasePool 就是用來做引用計數(shù)的管理工作的,這個東西一般不用你管的.
3. autorelease和release沒什么區(qū)別,只是引用計數(shù)減一的時機(jī)不同而已,autorelease會在對象的使用真正結(jié)束的時候才做引用計數(shù)減一.
22.類工廠方法是什么
類工廠方法的實現(xiàn)是為了向客戶提供方便,它們將分配和初始化合在一個步驟中,返回被創(chuàng)建的對象,并
進(jìn)行自動釋放處理。這些方法的形式是+ (type)className…(其中 className不包括任何前綴)。
工廠方法可能不僅僅為了方便使用。它們不但可以將分配和初始化合在一起,還可以為初始化過程提供對
象的分配信息。
類工廠方法的另一個目的是使類(比如NSWorkspace)提供單件實例。雖然init…方法可以確認(rèn)一
個類在每次程序運行過程只存在一個實例,但它需要首先分配一個“生的”實例,然后還必須釋放該實例。
工廠方法則可以避免為可能沒有用的對象盲目分配內(nèi)存。
23.單件實例是什么
Foundation 和 Application Kit 框架中的一些類只允許創(chuàng)建單件對象,即這些類在當(dāng)前進(jìn)程中的唯一實例。舉例來說,NSFileManager 和NSWorkspace 類在使用時都是基于進(jìn)程進(jìn)行單件對象的實例化。當(dāng)向這些類請求實例的時候,它們會向您傳遞單一實例的一個引用,如果該實例還不存在,則首先進(jìn)行實例的分配 和初始化。單件對象充當(dāng)控制中心的角色,負(fù)責(zé)指引或協(xié)調(diào)類的各種服務(wù)。如果類在概念上只有一個實例(比如
NSWorkspace),就應(yīng)該產(chǎn)生一個單件實例,而不是多個實例;如果將來某一天可能有多個實例,您可
以使用單件實例機(jī)制,而不是工廠方法或函數(shù)。
24.動態(tài)綁定
—在運行時確定要調(diào)用的方法
動 態(tài)綁定將調(diào)用方法的確定也推遲到運行時。在編譯時,方法的調(diào)用并不和代碼綁定在一起,只有在消實發(fā)送出來之后,才確定被調(diào)用的代碼。通過動態(tài)類型和動態(tài)綁 定技術(shù),您的代碼每次執(zhí)行都可以得到不同的結(jié)果。運行時因子負(fù)責(zé)確定消息的接收者和被調(diào)用的方法。運行時的消息分發(fā)機(jī)制為動態(tài)綁定提供支持。當(dāng)您向一個動 態(tài)類型確定了的對象發(fā)送消息時,運行環(huán)境系統(tǒng)會通過接收者的isa指針定位對象的類,并以此為起點確定被調(diào)用的方法,方法和消息是動態(tài)綁定的。而且,您不 必在Objective-C 代碼中做任何工作,就可以自動獲取動態(tài)綁定的好處。您在每次發(fā)送消息時,
特別是當(dāng)消息的接收者是動態(tài)類型已經(jīng)確定的對象時,動態(tài)綁定就會例行而透明地發(fā)生。
25.obj-c的優(yōu)缺點
objc優(yōu)點:
1) Cateogies
2) Posing
3) 動態(tài)識別
4) 指標(biāo)計算
5)彈性訊息傳遞
6) 不是一個過度復(fù)雜的 C 衍生語言
7) Objective-C 與 C++ 可混合編程
缺點:
1) 不支援命名空間
2) 不支持運算符重載
3) 不支持多重繼承
4) 使用動態(tài)運行時類型,所有的方法都是函數(shù)調(diào)用,所以很多編譯時優(yōu)化方法都用不到。(如內(nèi)聯(lián)函數(shù)等),性能低劣。
26.sprintf,strcpy,memcpy使用上有什么要注意的地方
strcpy是一個字符串拷貝的函數(shù),它的函數(shù)原型為strcpy(char dst, ct char src);
將 src開始的一段字符串拷貝到dst開始的內(nèi)存中去,結(jié)束的標(biāo)志符號為’\0′,由于拷貝的長度不是由我們自己控制的,所以這個字符串拷貝很容易出錯。具 備字符串拷貝功能的函數(shù)有memcpy,這是一個內(nèi)存拷貝函數(shù),它的函數(shù)原型為memcpy(char dst, ct char src, unsigned int len);
將長度為len的一段內(nèi)存,從src拷貝到dst中去,這個函數(shù)的長度可控。但是會有內(nèi)存疊加的問題。
sprintf是格式化函數(shù)。將一段數(shù)據(jù)通過特定的格式,格式化到一個字符串緩沖區(qū)中去。sprintf格式化的函數(shù)的長度不可控,有可能格式化后的字符串會超出緩沖區(qū)的大小,造成溢出。
27. 用變量a給出下面的定義
a) 一個整型數(shù)(An integer)
b)一個指向整型數(shù)的指針( A pointer to an integer)
c)一個指向指針的的指針,它指向的指針是指向一個整型數(shù)( A pointer to a pointer to an intege)r
d)一個有10個整型數(shù)的數(shù)組( An array of 10 integers)
e) 一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的。(An array of 10 pointers to integers)
f) 一個指向有10個整型數(shù)數(shù)組的指針( A pointer to an array of 10 integers)
g) 一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(A pointer to a function that takes an integer as an argument
and returns an integer)
h)一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)( An array of ten pointers to functi t
hat take an integer argument and return an integer )
答案是:
a) int a; // An integer
b) int a; // A pointer to an integer
c) int a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int a[10]; // An array of 10 pointers to integers
f) int (a)[10]; // A pointer to an array of 10 integers
g) int (a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (a[10])(int); // An array of 10 pointers to functi that take an integer argument and return an integer
28.readwrite,readonly,assign,retain,copy,nonatomic屬性的作用
@property是一個屬性訪問聲明,擴(kuò)號內(nèi)支持以下幾個屬性:
1,getter=getterName,setter=setterName,設(shè)置setter與getter的方法名
2,readwrite,readonly,設(shè)置可供訪問級別
2,assign,setter方法直接賦值,不進(jìn)行任何retain操作,為了解決原類型與環(huán)循引用問題
3,retain,setter方法對參數(shù)進(jìn)行release舊值再retain新值,所有實現(xiàn)都是這個順序(CC上有相關(guān)資料)
4,copy,setter方法進(jìn)行Copy操作,與retain處理流程一樣,先舊值release,再Copy出新的對象,retainCount為1。這是為了減少對上下文的依賴而引入的機(jī)制。
5,nonatomic,非原子性訪問,不加同步,多線程并發(fā)訪問會提高性能。注意,如果不加此屬性,則默認(rèn)是兩個訪問方法都為原子型事務(wù)訪問。鎖被加到所屬對象實例級(我是這么理解的…)。
2020年河北新聞網(wǎng)兩學(xué)一做
時間:2023-09-18 07:0:242020年河北新聞網(wǎng)兩學(xué)一做
時間:2023-09-15 11:0:59兩學(xué)一做學(xué)習(xí)教育知
時間:2023-09-21 06:0:302020年開展兩學(xué)一做學(xué)習(xí)教
時間:2023-09-19 21:0:30