成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深度解析Objective-C筆試題

移動(dòng)開(kāi)發(fā) iOS
本文介紹的是Objective-C筆試題,先來(lái)問(wèn)一個(gè),為什么很多內(nèi)置類(lèi)如UITableViewController的delegate屬性都是assign而不是retain的?看本文詳細(xì)詳細(xì)解答內(nèi)容。

Objective-C筆試題是本文要介紹的內(nèi)容,很詳細(xì)的講解寫(xiě)的答案。大約有18個(gè)Objective-C問(wèn)題供你參考學(xué)習(xí),不多說(shuō),我們一起來(lái)看詳細(xì)解答!

1.Objective-C中,與alloc語(yǔ)義相反的方法是dealloc還是release?與retain語(yǔ)義相反的方法是dealloc還是release,為什么?需要與alloc配對(duì)使用的方法是dealloc還是release,為什么?

答:alloc與dealloc語(yǔ)意相反,alloc是創(chuàng)建變量,dealloc是釋放變量。 retain 對(duì)應(yīng)release,retain 保留一個(gè)對(duì)象。調(diào)用之后,變量的計(jì)數(shù)加1。或許不是很明顯,在這有例為證:

  1. - (void) setName : (NSString*) name {   
  2.      [name retain];   
  3.      [myname release];   
  4.      myname = name;   
  5. }  

我們來(lái)解釋一下:設(shè)想,用戶(hù)在調(diào)用這個(gè)函數(shù)的時(shí)候,他注意了內(nèi)存的管理,所以他小心的寫(xiě)了如下代碼:

  1. NSString * newname = [[NSString alloc] initWithString: @"John"];   
  2. [aClass setName: newname];   
  3. [newname release];  

我們來(lái)看一看newname的計(jì)數(shù)是怎么變化的。首先,它被alloc,count = 1; 然后,在setName中,它被retain, count = 2; ***,用戶(hù)自己釋放newname,count = 1,myname指向了newname。這也解釋了為什么需要調(diào)用[myname release]。我們需要在給myname賦新值的時(shí)候,釋放掉以前老的變量。retain 之后直接dealloc對(duì)象計(jì)數(shù)器沒(méi)有釋放。alloc 需要與release配對(duì)使用,因?yàn)閍lloc 這個(gè)函數(shù)調(diào)用之后,變量的計(jì)數(shù)加1。所以在調(diào)用alloc 之后,一定要調(diào)用對(duì)應(yīng)的release。另外,在release一個(gè)變量之后,他的值仍然有效,所以***是后面緊接著再var = nil。

2.在一個(gè)對(duì)象的方法里面:

self.name = “object”;

name =”object”

有什么不同嗎? 

答:self.name = "object"會(huì)調(diào)用對(duì)象的setName()方法,name = "object"會(huì)直接把object賦值給當(dāng)前對(duì)象的name 屬性。

[backcolor=transparent][backcolor=transparent]

3.這段代碼有什么問(wèn)題嗎:

  1. [backcolor=transparent]@implementation Person   
  2. [backcolor=transparent]- (void)setAge:(int)newAge {   
  3. [backcolor=transparent]self.age = newAge;   
  4. [backcolor=transparent]}   
  5. [backcolor=transparent]  
  6. @end  

答:會(huì)進(jìn)入死循環(huán)。

4.什么是retain count?

答:引用計(jì)數(shù)(ref count或者retain count)。對(duì)象的內(nèi)部保存一個(gè)數(shù)字,表示被引用的次數(shù)。例如,某個(gè)對(duì)象被兩個(gè)指針?biāo)赶颍ㄒ茫┠敲此膔etain count為2。需要銷(xiāo)毀對(duì) 象的時(shí)候,不直接調(diào)用dealloc,而是調(diào)用release。release會(huì) 讓retain count減1,只有retain count等于0,系統(tǒng)才會(huì)調(diào)用dealloc真正銷(xiāo)毀這個(gè)對(duì)象。

5.以下每行代碼執(zhí)行后,person對(duì)象的retain count分別是多少

  1. Person *person = [[Person alloc] init]; count 1   
  2. [person retain]; count 2   
  3. [person release];count 1   
  4. [person release];retain count = 1;  

6.為什么很多內(nèi)置類(lèi)如UITableViewController的delegate屬性都是assign而不是retain的?

答:會(huì)引起循環(huán)引用。

7.定義屬性時(shí),什么情況使用copy,assign,和retain 。

答:assign用于簡(jiǎn)單數(shù)據(jù)類(lèi)型,如NSInteger,double,bool,retain 和copy用戶(hù)對(duì)象,copy用于當(dāng) a指向一個(gè)對(duì)象,b也想指向同樣的對(duì)象的時(shí)候,如果用assign,a如果釋放,再調(diào)用b會(huì)crash,如果用copy 的方式,a和b各自有自己的內(nèi)存,就可以解決這個(gè)問(wèn)題。retain 會(huì)使計(jì)數(shù)器加一,也可以解決assign的問(wèn)題。另外:atomic和nonatomic用來(lái)決定編譯器生成的getter和setter是否為原子操作。在多線程環(huán)境下,原子操作是必要的,否則有可能引起錯(cuò)誤的結(jié)果。加了atomic,setter函數(shù)會(huì)變成下面這樣:

  1. if (property != newValue) {    
  2.      [property release];         
  3.      property = [newValue retain];    
  4.  }    

8.的對(duì)象是在什么時(shí)候被release的?

答:autorelease實(shí)際上只是把對(duì)release的調(diào)用延遲了,對(duì)于每一個(gè)Autorelease,系統(tǒng)只是把該Object放入了當(dāng)前的Autorelease pool中,當(dāng)該pool被釋放時(shí),該pool中的所有Object會(huì)被調(diào)用Release。對(duì)于每一個(gè)Runloop,系統(tǒng)會(huì)隱式創(chuàng)建一個(gè)Autorelease pool,這樣所有的release pool會(huì)構(gòu)成一個(gè)象CallStack一樣的一個(gè)棧式結(jié)構(gòu),在每一個(gè)Runloop結(jié)束時(shí),當(dāng)前棧頂?shù)腁utorelease pool會(huì)被銷(xiāo)毀,這樣這個(gè)pool里的每個(gè)Object(就是autorelease的對(duì)象)會(huì)被release。那什么是一個(gè)Runloop呢?一個(gè)UI事件,Timer call, delegate call, 都會(huì)是一個(gè)新的Runloop。那什么是一個(gè)Runloop呢?一個(gè)UI事件,Timer call, delegate call,都會(huì)是一個(gè)新的Runloop。

9.這段代碼有什么問(wèn)題,如何修改

  1. for (int i = 0; i < someLargeNumber; i++)   
  2. {   
  3. NSString *string = @”Abc”;   
  4. string = [string lowercaseString];   
  5. string = [string stringByAppendingString:@"xyz"];   
  6. NSLog(@“%@”, string);   
  7. }  

答:會(huì)內(nèi)存泄露,

  1. for(int i = 0; i<1000;i++){   
  2. NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];   
  3. NSString *string = @"Abc";   
  4. string = [string lowercaseString];   
  5. string = [string stringByAppendingString:@"xyz"];   
  6. NSLog(@"%@",string);   
  7. [pool1 drain];   
  8. }  

10.autorelease和垃圾回收機(jī)制(gc)有什么關(guān)系?

答案:不懂

11.IPhone OS有沒(méi)有垃圾回收(gc)?

沒(méi)有

12.什么是Notification?

答:觀察者模式,controller向defaultNotificationCenter添加自己的notification,其他類(lèi)注冊(cè)這個(gè)notification就可以收到通知,這些類(lèi)可以在收到通知時(shí)做自己的操作(多觀察者默認(rèn)隨機(jī)順序發(fā)通知給觀察者們,而且每個(gè)觀察者都要等當(dāng)前的某個(gè)觀察者的操作做完才能輪到他來(lái)操作,可以用NotificationQueue的方式安排觀察者的反應(yīng)順序,也可以在添加觀察者中設(shè)定反映時(shí)間,取消觀察需要在viewDidUnload 跟dealloc中都要注銷(xiāo))。參考鏈接:http://useyourloaf.com/blog/2010/6/6/delegation-or-notification.html

13.什么時(shí)候用delegate,什么時(shí)候用Notification?

答:delegate針對(duì)one-to-one關(guān)系,并且reciever可以返回值給sender,notification 可以針對(duì)one-to-one/many/none,reciever無(wú)法返回值給sender.所以,delegate用于sender希望接受到reciever的某個(gè)功能反饋值,notification用于通知多個(gè)object某個(gè)事件。

14.什么是KVC和KVO?

答:KVC(Key-Value-Coding)內(nèi)部的實(shí)現(xiàn):一個(gè)對(duì)象在調(diào)用setValue的時(shí)候,(1)首先根據(jù)方法名找到運(yùn)行方法的時(shí)候所需要的環(huán)境參數(shù)。(2)他會(huì)從自己isa指針結(jié)合環(huán)境參數(shù),找到具體的方法實(shí)現(xiàn)的接口。(3)再直接查找得來(lái)的具體的方法實(shí)現(xiàn)。KVO(Key-Value-Observing):當(dāng)觀察者為一個(gè)對(duì)象的屬性進(jìn)行了注冊(cè),被觀察對(duì)象的isa指針被修改的時(shí)候,isa指針就會(huì)指向一個(gè)中間類(lèi),而不是真實(shí)的類(lèi)。所以isa指針其實(shí)不需要指向?qū)嵗龑?duì)象真實(shí)的類(lèi)。所以我們的程序***不要依賴(lài)于isa指針。在調(diào)用類(lèi)的方法的時(shí)候,***要明確對(duì)象實(shí)例的類(lèi)名。

15.Notification和KVO有什么不同?

答:不知道

16.KVO在Objective-C中是怎么實(shí)現(xiàn)的?

答:不知道

17.ViewController 的 loadView, viewDidLoad, viewDidUnload 分別是在什么時(shí)候調(diào)用的?在自定義ViewController的時(shí)候這幾個(gè)函數(shù)里面應(yīng)該做什么工作?

答:viewDidLoad在view 從nib文件初始化時(shí)調(diào)用,loadView在controller的view為nil時(shí)調(diào)用。此方法在編程實(shí)現(xiàn)view時(shí)調(diào)用,view 控制器默認(rèn)會(huì)注冊(cè)memory warning notification,當(dāng)view controller的任何view 沒(méi)有用的時(shí)候,viewDidUnload會(huì)被調(diào)用,在這里實(shí)現(xiàn)將retain 的view release,如果是retain的IBOutlet view 屬性則不要在這里release,IBOutlet會(huì)負(fù)責(zé)release 。

18.ViewController 的 didReceiveMemoryWarning 是在什么時(shí)候被調(diào)用的?默認(rèn)的操作是什么?

答:默認(rèn)調(diào)用[super didReceiveMemoryWarning] 

小結(jié):深度解析Objective-C筆試題的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-08-15 14:02:36

Objective-C

2011-07-29 16:08:31

Objective-C 內(nèi)存

2011-08-10 18:07:29

Objective-C反射

2013-03-27 12:54:00

iOS開(kāi)發(fā)Objective-C

2011-08-05 15:46:32

Objective-C 程序設(shè)計(jì)

2013-06-20 10:40:32

Objective-C實(shí)現(xiàn)截圖

2011-05-11 11:20:26

Objective-C

2011-05-11 15:58:34

Objective-C

2011-08-04 15:52:48

Objective-C HTML

2011-05-11 13:54:08

Objective-C

2011-05-11 15:45:50

內(nèi)存管理Objective-C

2011-08-02 13:16:36

Objective-C 語(yǔ)法 函數(shù)

2011-08-04 11:15:46

Objective-C 構(gòu)造函數(shù) 構(gòu)造方法

2011-05-11 14:06:49

Objective-C

2011-08-04 14:58:37

Objective-C Cocoa NSString

2013-08-21 14:57:42

objective-c問(wèn)題

2011-08-03 16:55:05

Objective-C 代理

2011-08-04 09:35:09

Objective-C 編碼規(guī)范

2014-04-30 10:16:04

Objective-CiOS語(yǔ)法

2014-06-25 14:02:59

Objective-CKVO
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久久久久久久毛片 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 亚洲一卡二卡 | www国产成人免费观看视频 | 欧美精品一区二区三区蜜桃视频 | 九九久久这里只有精品 | 国产综合在线视频 | 日韩在线中文字幕 | 精品麻豆剧传媒av国产九九九 | 在线午夜电影 | 久久伊人青青草 | 日韩精品视频在线 | 久久国产婷婷国产香蕉 | 亚洲+变态+欧美+另类+精品 | 亚洲精品成人 | 最新中文字幕久久 | 蜜桃精品视频在线 | 一区二区三区中文字幕 | 日韩精品视频在线观看一区二区三区 | 香蕉大人久久国产成人av | 亚洲不卡在线观看 | 一级毛片中国 | 日本大香伊一区二区三区 | 久草在线 | 最新黄色毛片 | 欧美日韩福利 | 国产九九九九 | 国产乱码精品一区二区三区中文 | 国产精品久久久久久婷婷天堂 | 亚洲精品66 | 久久久一二三区 | 福利网址| 亚洲综合二区 | 99精品在线观看 | 亚洲一区二区免费视频 | 狠狠操狠狠操 | 欧美高清视频在线观看 | 午夜精品久久久久久久久久久久久 | 欧美福利视频一区 | 国产精品高潮呻吟久久aⅴ码 | 国产精品视频网 |