iPhone軟件開發面試題(4)
31.動態綁定

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