iPhone軟件開發(fā)面試題(4)
31.動態(tài)綁定

在運行時確定要調(diào)用的方法,動態(tài)綁定將調(diào)用方法的確定也推遲到運行時。在編譯時,方法的調(diào)用并不和代碼綁定在一起,只有在消息發(fā)送出來之后,才確定被調(diào)用的代碼。通過動態(tài)類型和動態(tài)綁定技術(shù),您的代碼每次執(zhí)行都可以得到不同的結(jié)果。運行時因子負責確定消息的接收者和被調(diào)用的方法。運行時的消息分發(fā)機制為動態(tài)綁定提供支持。當您向一個動態(tài)類型確定了的對象發(fā)送消息時,運行環(huán)境系統(tǒng)會通過接收者的isa指針定位對象的類,并以此為起點確定被調(diào)用的方法,方法和消息是動態(tài)綁定的。而且,您不必在Objective-C 代碼中做任何工作,就可以自動獲取動態(tài)綁定的好處。您在每次發(fā)送消息時,特別是當消息的接收者是動態(tài)類型已經(jīng)確定的對象時,動態(tài)綁定就會例行而透明地發(fā)生。
32.obj-c 的優(yōu)缺點
Obj-c優(yōu)點:
1) Cateogies
2) Posing
3) 動態(tài)識別
4) 指標計算
5) 彈性訊息傳遞
6) 不是一個過度復(fù)雜的 C 衍生語言
7) Objective-C 與 C 可混合編程?
Obj-c缺點:
1)不支持命名空間
2)不支持運算符重載
3)不支持多重繼承
4)使用動態(tài)運行時類型,所有的方法都是函數(shù)調(diào)用,所以很多編譯時優(yōu)化方法都用不到。(如內(nèi)聯(lián)函數(shù)等),性能低劣。
33.sprintf,strcpy,memcpy使用上有什么要注意的地方
strcpy是一個字符串拷貝的函數(shù),它的函數(shù)原型為strcpy(char *dst, const char *src);
將 src開始的一段字符串拷貝到dst開始的內(nèi)存中去,結(jié)束的標志符號為 '\0',由于拷貝的長度不是由我們自己控制的,所以這個字符串拷貝很容易出錯。具備字符串拷貝功能的函數(shù)有memcpy,這是一個內(nèi)存拷貝函數(shù),它的函數(shù)原型為memcpy(char *dst,const char* src, unsigned int len);
將長度為len的一段內(nèi)存,從src拷貝到dst中去,這個函數(shù)的長度可控。但是會有內(nèi)存疊加的問題。
sprintf是格式化函數(shù)。將一段數(shù)據(jù)通過特定的格式,格式化到一個字符串緩沖區(qū)中去。sprintf格式化的函數(shù)的長度不可控,有可能格式化后的字符串會超出緩沖區(qū)的大小,造成溢出。
34. 用變量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 anargument? and returns an integer)
h)一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)( An array of ten pointersto functions t?hat take an integer argument and returnan 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 tofunctions that take an integer argument and return an integer
35.readwrite ,readonly ,assign ,retain ,copy,nonatomic 屬性的作用
@property是 一個屬性訪問聲明,擴號內(nèi)支持以下幾個屬性:
1、getter=getterName,setter=setterName,設(shè)置setter與 getter的方法名
2、readwrite,readonly,設(shè)置可供訪問級別
3、assign,setter方法直接賦值,不進行 任何retain操作,為了解決原類型與環(huán)循引用問題
4、retain,setter方法對參數(shù)進行release舊值再retain新值,所有 實現(xiàn)都是這個順序(CC上有相關(guān)資料)
5、copy,setter方法進行Copy操作,與retain處理流程一樣,先舊值release,再 Copy出新的對象,retainCount為1。這是為了減少對上下文的依賴而引入的機制。
6、nonatomic,非原子性訪問,不加同步,多線程并發(fā)訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法都為原子型事務(wù)訪問。鎖被加到所屬對象實例級(我是這么理解的...)。?@synthesize xxx; 來實現(xiàn)實際代碼
36.ObjC中,與alloc語義相反的方法是dealloc還是release?與retain語義相反的方法是dealloc還是release,為什么?需要與alloc配對使用的方法是dealloc還是release,為什么?
答:alloc與dealloc語意相反,alloc是創(chuàng)建變量,dealloc是釋放變量。 retain 對應(yīng)release,retain 保留一個對象。調(diào)用之后,變量的計數(shù)加1。或許不是很明顯,
在這有例為證:
- (void) setName: (NSString*) name {
[name retain];
[myname release];
myname = name;
}
我們來解釋一下:設(shè)想,用戶在調(diào)用這個函數(shù)的時候,他注意了內(nèi)存的管理,所以他小心的寫了如下代碼:
NSString * newname = [[NSString alloc] initWithString: @"John"];
[aClass setName: newname];
[newname release];
我們來看一看newname的計數(shù)是怎么變化的。首先,它被alloc,count = 1; 然后,在setName中,它被retain, count = 2; 最后,用戶自己釋放newname,count = 1,myname指向了newname。這也解釋了為什么需要調(diào)用[myname release]。我們需要在給myname賦新值的時候,釋放掉以前老的變量。retain 之后直接dealloc對象計數(shù)器沒有釋放。alloc 需要與release配對使用,因為alloc 這個函數(shù)調(diào)用之后,變量的計數(shù)加1。所以在調(diào)用alloc 之后,一定要調(diào)用對應(yīng)的release。另外,在release一個變量之后,他的值仍然有效,所以最好是后面緊接著再var = nil。
37.什么是retaincount?
答:引用計數(shù)(refcount或者retain count)。對象的內(nèi)部保存一個數(shù)字,表示被引用的次數(shù)。例如,某個對象被兩個指針所指向(引用)那么它的retain count為2。需要銷毀對象的時候,不直接調(diào)用dealloc,而是調(diào)用release。release會讓retain count減1,只有retaincount等于0,系統(tǒng)才會調(diào)用dealloc真正銷毀這個對象。
38.以下每行代碼執(zhí)行后,person對象的retain count分別是多少
Person *person =[[Person alloc] init]; count 1
[person retain]; count 2
[person release];count 1
[person release];retain count = 1;
39.為什么很多內(nèi)置類如UITableViewController的delegate屬性都是assign而不是retain的?
答:會引起循環(huán)引用。
40.定義屬性時,什么情況使用copy,assign ,和retain
答:assign用于簡單數(shù)據(jù)類型,如NSInteger,double,bool,retain 和copy用戶對象,copy用于當 a指向一個對象,b也想指向同樣的對象的時候,如果用assign,a如果釋放,再調(diào)用b會crash,如果用copy 的方式,a和b各自有自己的內(nèi)存,就可以解決這個問題。retain 會使計數(shù)器加一,也可以解決assign的問題。另外:atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多線程環(huán)境下,原子操作是必要的,否則有可能引起錯誤的結(jié)果。加了atomic,setter函數(shù)會變成下面這樣:
if (property != newValue)
{
[property release];
property = [newValue retain];
}
【iPhone軟件開發(fā)面試題(4)】相關(guān)文章:
iPhone軟件開發(fā)面試題10-23
Microsoft面試題09-04
iOS面試題07-10
公司面試題09-12
iphone鎖屏密碼忘了怎么辦07-10
hibernate面試題10-18
英語面試題精選06-13
小升初面試題06-10
PHP面試題10-14
小升初面試題型08-24