iOS基礎教程之Objective-C:Objective-C筆試題
做者:藍鷗科技 發佈於:2012-12-14 14:38 Friday 分類:iOS中級-OC開發html
Objective-C筆試題是本文要介紹的內容,很詳細的講解寫的答案。大約有18個Objective-C問題供你參考學習,很少說,咱們一塊兒來看詳細解答!
1.Objective-C中,與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。
2.在一個對象的方法裏面:
self.name = 「object」;
和
name =」object」
有什麼不一樣嗎?
答:self.name = "object"會調用對象的setName()方法,name = "object"會直接把object賦值給當前對象的name 屬性。
[backcolor=transparent][backcolor=transparent]
3.這段代碼有什麼問題嗎:
[backcolor=transparent]@implementation Person
[backcolor=transparent]- (void)setAge:(int)newAge {
[backcolor=transparent]self.age = newAge;
[backcolor=transparent]}
[backcolor=transparent]
@end
答:會進入死循環。
4.什麼是retain count?
答:引用計數(ref count或者retain count)。對象的內部保存一個數字,表示被引用的次數。例如,某個對象被兩個指針所指向(引用)那麼它的retain count爲2。須要銷燬對 象的時候,不直接調用dealloc,而是調用release。release會 讓retain count減1,只有retain count等於0,系統纔會調用dealloc真正銷燬這個對象。
5.如下每行代碼執行後,person對象的retain count分別是多少
Person *person = [[Person alloc] init]; count 1
[person retain]; count 2
[person release];count 1
[person release];retain count = 1;
6.爲何不少內置類如UITableViewController的delegate屬性都是assign而不是retain的?
答:會引發循環引用。
7.定義屬性時,什麼狀況使用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];
}
8.的對象是在何時被release的?
答:autorelease實際上只是把對release的調用延遲了,對於每個Autorelease,系統只是把該Object放入了當前的Autorelease pool中,當該pool被釋放時,該pool中的全部Object會被調用Release。對於每個Runloop,系統會隱式建立一個Autorelease pool,這樣全部的release pool會構成一個象CallStack同樣的一個棧式結構,在每個Runloop結束時,當前棧頂的Autorelease pool會被銷燬,這樣這個pool裏的每一個Object(就是autorelease的對象)會被release。那什麼是一個Runloop呢?一個UI事件,Timer call, delegate call, 都會是一個新的Runloop。那什麼是一個Runloop呢?一個UI事件,Timer call, delegate call,都會是一個新的Runloop。
9.這段代碼有什麼問題,如何修改
for (int i = 0; i < someLargeNumber; i++)
{
NSString *string = @」Abc」;
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@「%@」, string);
}
答:會內存泄露,
for(int i = 0; i<1000;i++){
NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];
NSString *string = @"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@"%@",string);
[pool1 drain];
}
10.autorelease和垃圾回收機制(gc)有什麼關係?
答案:不懂
11.IPhone OS有沒有垃圾回收(gc)?
沒有
12.什麼是Notification?
答:觀察者模式,controller向defaultNotificationCenter添加本身的notification,其餘類註冊這個notification就能夠收到通知,這些類能夠在收到通知時作本身的操做(多觀察者默認隨機順序發通知給觀察者們,並且每一個觀察者都要等當前的某個觀察者的操做作完才能輪到他來操做,能夠用NotificationQueue的方式安排觀察者的反應順序,也能夠在添加觀察者中設定反映時間,取消觀察須要在viewDidUnload 跟dealloc中都要註銷)。參考連接:http://useyourloaf.com/blog/2010/6/6/delegation-or-notification.html
13.何時用delegate,何時用Notification?
答:delegate針對one-to-one關係,而且reciever能夠返回值給sender,notification 能夠針對one-to-one/many/none,reciever沒法返回值給sender.因此,delegate用於sender但願接受到reciever的某個功能反饋值,notification用於通知多個object某個事件。
14.什麼是KVC和KVO?
答:KVC(Key-Value-Coding)內部的實現:一個對象在調用setValue的時候,(1)首先根據方法名找到運行方法的時候所須要的環境參數。(2)他會從本身isa指針結合環境參數,找到具體的方法實現的接口。(3)再直接查找得來的具體的方法實現。KVO(Key-Value-Observing):當觀察者爲一個對象的屬性進行了註冊,被觀察對象的isa指針被修改的時候,isa指針就會指向一箇中間類,而不是真實的類。因此isa指針其實不須要指向實例對象真實的類。因此咱們的程序最好不要依賴於isa指針。在調用類的方法的時候,最好要明確對象實例的類名。
15.Notification和KVO有什麼不一樣?
答:不知道
16.KVO在Objective-C中是怎麼實現的?
答:不知道
17.ViewController 的 loadView, viewDidLoad, viewDidUnload 分別是在何時調用的?在自定義ViewController的時候這幾個函數裏面應該作什麼工做?
答:viewDidLoad在view 從nib文件初始化時調用,loadView在controller的view爲nil時調用。此方法在編程實現view時調用,view 控制器默認會註冊memory warning notification,當view controller的任何view 沒有用的時候,viewDidUnload會被調用,在這裏實現將retain 的view release,若是是retain的IBOutlet view 屬性則不要在這裏release,IBOutlet會負責release 。
18.ViewController 的 didReceiveMemoryWarning 是在何時被調用的?默認的操做是什麼?
答:默認調用[super didReceiveMemoryWarning]
iOS基礎教程之Objective-C開發系列:編程