深度解析Objective-C筆試題
Objective-C筆試題是本文要介紹的內(nèi)容,很詳細的講解寫的答案。大約有18個Objective-C問題供你參考學習,不多說,我們一起來看詳細解答!
1.Objective-C中,與alloc語義相反的方法是dealloc還是release?與retain語義相反的方法是dealloc還是release,為什么?需要與alloc配對使用的方法是dealloc還是release,為什么?
答:alloc與dealloc語意相反,alloc是創(chuàng)建變量,dealloc是釋放變量。 retain 對應release,retain 保留一個對象。調(diào)用之后,變量的計數(shù)加1。或許不是很明顯,在這有例為證:
- - (void) setName : (NSString*) name {
- [name retain];
- [myname release];
- myname = name;
- }
我們來解釋一下:設想,用戶在調(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)用對應的release。另外,在release一個變量之后,他的值仍然有效,所以***是后面緊接著再var = nil。
2.在一個對象的方法里面:
self.name = “object”;
和
name =”object”
有什么不同嗎?
答:self.name = "object"會調(diào)用對象的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
答:會進入死循環(huán)。
4.什么是retain count?
答:引用計數(shù)(ref count或者retain count)。對象的內(nèi)部保存一個數(shù)字,表示被引用的次數(shù)。例如,某個對象被兩個指針所指向(引用)那么它的retain count為2。需要銷毀對 象的時候,不直接調(diào)用dealloc,而是調(diào)用release。release會 讓retain count減1,只有retain count等于0,系統(tǒng)才會調(diào)用dealloc真正銷毀這個對象。
5.以下每行代碼執(zhí)行后,person對象的retain count分別是多少
- Person *person = [[Person alloc] init]; count 1
- [person retain]; count 2
- [person release];count 1
- [person release];retain count = 1;
6.為什么很多內(nèi)置類如UITableViewController的delegate屬性都是assign而不是retain的?
答:會引起循環(huán)引用。
7.定義屬性時,什么情況使用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)境下,原子操作是必要的,否則有可能引起錯誤的結果。加了atomic,setter函數(shù)會變成下面這樣:
- if (property != newValue) {
- [property release];
- property = [newValue retain];
- }
8.的對象是在什么時候被release的?
答:autorelease實際上只是把對release的調(diào)用延遲了,對于每一個Autorelease,系統(tǒng)只是把該Object放入了當前的Autorelease pool中,當該pool被釋放時,該pool中的所有Object會被調(diào)用Release。對于每一個Runloop,系統(tǒng)會隱式創(chuàng)建一個Autorelease pool,這樣所有的release pool會構成一個象CallStack一樣的一個棧式結構,在每一個Runloop結束時,當前棧頂?shù)腁utorelease 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);
- }
答:會內(nèi)存泄露,
- 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就可以收到通知,這些類可以在收到通知時做自己的操作(多觀察者默認隨機順序發(fā)通知給觀察者們,而且每個觀察者都要等當前的某個觀察者的操作做完才能輪到他來操作,可以用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)內(nèi)部的實現(xiàn):一個對象在調(diào)用setValue的時候,(1)首先根據(jù)方法名找到運行方法的時候所需要的環(huán)境參數(shù)。(2)他會從自己isa指針結合環(huán)境參數(shù),找到具體的方法實現(xiàn)的接口。(3)再直接查找得來的具體的方法實現(xiàn)。KVO(Key-Value-Observing):當觀察者為一個對象的屬性進行了注冊,被觀察對象的isa指針被修改的時候,isa指針就會指向一個中間類,而不是真實的類。所以isa指針其實不需要指向實例對象真實的類。所以我們的程序***不要依賴于isa指針。在調(diào)用類的方法的時候,***要明確對象實例的類名。
15.Notification和KVO有什么不同?
答:不知道
16.KVO在Objective-C中是怎么實現(xiàn)的?
答:不知道
17.ViewController 的 loadView, viewDidLoad, viewDidUnload 分別是在什么時候調(diào)用的?在自定義ViewController的時候這幾個函數(shù)里面應該做什么工作?
答:viewDidLoad在view 從nib文件初始化時調(diào)用,loadView在controller的view為nil時調(diào)用。此方法在編程實現(xiàn)view時調(diào)用,view 控制器默認會注冊memory warning notification,當view controller的任何view 沒有用的時候,viewDidUnload會被調(diào)用,在這里實現(xiàn)將retain 的view release,如果是retain的IBOutlet view 屬性則不要在這里release,IBOutlet會負責release 。
18.ViewController 的 didReceiveMemoryWarning 是在什么時候被調(diào)用的?默認的操作是什么?
答:默認調(diào)用[super didReceiveMemoryWarning]
小結:深度解析Objective-C筆試題的內(nèi)容介紹完了,希望本文對你有所幫助!