背景:
閱讀新聞
10個(gè)Objective-C基礎(chǔ)面試題,iOS面試必備
[日期:2013-07-15]
來源:codeceo.com
作者:Linux
[字體:大 中 小]
蘋果的iOS系統(tǒng)越來越火了,蘋果這個(gè)金礦平臺(tái)也吸引了大量的iOS開發(fā)者參與其中,這也促使越來越多的公司向iOS應(yīng)用開發(fā)方向靠攏,因此市場(chǎng)上 對(duì)iOS開發(fā)的人才需求自然也非常巨大。如果你準(zhǔn)備去面試一個(gè)iOS開發(fā)崗位,那么本文也許可以幫助你提前準(zhǔn)備一些iOS面試題,這些面試題都是 Objective-C基礎(chǔ)面試題,一起來看看。
1、#import和#include的區(qū)別,@class代表什么?
@class一般用于頭文件中需要聲明該類的某個(gè)實(shí)例變量的時(shí)候用到,在m文件中還是需要使用#import
而#import比起#include的好處就是不會(huì)引起重復(fù)包含
2瘤载、談?wù)凮bject-C的內(nèi)存管理方式及過程?
1.當(dāng)你使用new,alloc和copy方法創(chuàng)建一個(gè)對(duì)象時(shí),該對(duì)象的保留計(jì)數(shù)器值為1.當(dāng)你不再使用該對(duì)象時(shí),你要負(fù)責(zé)向該對(duì)象發(fā)送一條release或autorelease消息.這樣,該對(duì)象將在使用壽命結(jié)束時(shí)被銷毀.
2.當(dāng)你通過任何其他方法獲得一個(gè)對(duì)象時(shí),則假設(shè)該對(duì)象的保留計(jì)數(shù)器值為1,而且已經(jīng)被設(shè)置為自動(dòng)釋放,你不需要執(zhí)行任何操作來確保該對(duì)象被清理.如果你打算在一段時(shí)間內(nèi)擁有該對(duì)象,則需要保留它并確保在操作完成時(shí)釋放它.
3.如果你保留了某個(gè)對(duì)象,你需要(最終)釋放或自動(dòng)釋放該對(duì)象.必須保持retain方法和release方法的使用次數(shù)相等.
3碍脏、Object-C有私有方法嗎?私有變量呢?
objective-c – 類里面的方法只有兩種, 靜態(tài)方法和實(shí)例方法. 這似乎就不是完整的面向?qū)ο罅?按照OO的原則就是一個(gè)對(duì)象只暴露有用的東西. 如果沒有了私有方法的話, 對(duì)于一些小范圍的代碼重用就不那么順手了. 在類里面聲名一個(gè)私有方法
@interface Controller : NSObject { NSString *something; }
+ (void)thisIsAStaticMethod;
– (void)thisIsAnInstanceMethod;
@end
@interface Controller (private) -
(void)thisIsAPrivateMethod;
@end
@private可以用來修飾私有變量
在Objective‐C中,所有實(shí)例變量默認(rèn)都是私有的,所有實(shí)例方法默認(rèn)都是公有的
4癣疟、Object-C有多繼承嗎?沒有的話用什么代替?cocoa 中所有的類都是NSObject 的子類
多繼承在這里是用protocol 委托代理 來實(shí)現(xiàn)的
你不用去考慮繁瑣的多繼承 ,虛基類的概念.
ood的多態(tài)特性 在 obj-c 中通過委托來實(shí)現(xiàn).
5、內(nèi)存管理 Autorelease潮酒、retain睛挚、copy、assign的set方法和含義?
1,你初始化(alloc/init)的對(duì)象,你需要釋放(release)它急黎。例如:
NSMutableArray aArray = [[NSArray alloc] init]; 后,需要 [aArray release];
2,你retain或copy的,你需要釋放它扎狱。例如:
[aArray retain] 后,需要 [aArray release];
3,被傳遞(assign)的對(duì)象,你需要斟酌的retain和release。例如:
obj2 = [[obj1 someMethod] autorelease];
對(duì)象2接收對(duì)象1的一個(gè)自動(dòng)釋放的值,或傳遞一個(gè)基本數(shù)據(jù)類型(NSInteger,NSString)時(shí):你或希望將對(duì)象2進(jìn)行retain,以防止它在被使用之前就被自動(dòng)釋放掉勃教。但是在retain后,一定要在適當(dāng)?shù)臅r(shí)候進(jìn)行釋放淤击。
關(guān)于索引計(jì)數(shù)(Reference Counting)的問題
retain值 = 索引計(jì)數(shù)(Reference Counting)
NSArray對(duì)象會(huì)retain(retain值加一)任何數(shù)組中的對(duì)象。當(dāng)NSArray被卸載(dealloc)的時(shí)候,所有數(shù)組中的對(duì)象會(huì) 被 執(zhí)行一次釋放(retain值減一)故源。不僅僅是NSArray,任何收集類(Collection Classes)都執(zhí)行類似操作污抬。例如 NSDictionary,甚至UINavigationController。
Alloc/in九度快排系統(tǒng) https://www.190seo.comit建立的對(duì)象,索引計(jì)數(shù)為1绳军。無需將其再次retain印机。
[NSArray array]和[NSDate date]等“方法”建立一個(gè)索引計(jì)數(shù)為1的對(duì)象,但是也是一個(gè)自動(dòng)釋放對(duì)象。所以是本地臨時(shí)對(duì)象,那么無所謂了门驾。如果是打算在全Class中使用的變量(iVar),則必須retain它射赛。
缺省的類方法返回值都被執(zhí)行了“自動(dòng)釋放”方法。(*如上中的NSArray)
在類中的卸載方法“dealloc”中,release所有未被平衡的NS對(duì)象奶是。(*所有未被autorelease,而retain值為1的)
6楣责、淺拷貝和深拷貝區(qū)別是什么
簡(jiǎn)單的來說就是,在有指針的情況下,淺拷貝只是增加了一個(gè)指針指向已經(jīng)存在的內(nèi)存,而深拷貝就是增加一個(gè)指針并且申請(qǐng)一個(gè)新的內(nèi)存,使這個(gè)增加的指針指向這個(gè)新的內(nèi)存,采用深拷貝的情況下,釋放內(nèi)存的時(shí)候就不會(huì)出現(xiàn)在淺拷貝時(shí)重復(fù)釋放同一內(nèi)存的錯(cuò)誤
7、C和obj-c 如何混用
1)obj-c的編譯器處理后綴為m的文件時(shí),可以識(shí)別obj-c和c的代碼,處理mm文件可以識(shí)別obj-c,c,c++代碼,但cpp文件必須只能用c/c++代碼,而且cpp文件include的頭文件中,也不能出現(xiàn)obj-c的代碼,因?yàn)閏pp只是cpp
2)在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是問題
3)在cpp中混用obj-c其實(shí)就是使用obj-c編寫的模塊是我們想要的聂沙。
如果模塊以類實(shí)現(xiàn),那么要按照cpp class的標(biāo)準(zhǔn)寫類的定義,頭文件中不能出現(xiàn)obj-c的東西,包括#import cocoa的秆麸。實(shí)現(xiàn)文件中,即類的實(shí)現(xiàn)代碼中可以使用obj-c的東西,可以import,只是后綴是mm。
如果模塊以函數(shù)實(shí)現(xiàn),那么頭文件要按c的格式聲明函數(shù),實(shí)現(xiàn)文件中,c++函數(shù)內(nèi)部可以用obj-c,但后綴還是mm或m及汉。
總結(jié):只要cpp文件和cpp include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關(guān)鍵是使用接口,而不能直接使用 實(shí)現(xiàn)代 碼,實(shí)際上cpp混用的是obj-c編譯后的o文件,這個(gè)東西其實(shí)是無差別的,所以可以用沮趣。obj-c的編譯器支持cpp
8、Objective-C中類別和類擴(kuò)展的區(qū)別豁生。
答案:category和extensions的不同在于后者可以添加屬性兔毒。另外后者添加的方法是必須要實(shí)現(xiàn)的漫贞。
extensions可以認(rèn)為是一個(gè)私有的Category甸箱。
9、我們說的Objective-C是動(dòng)態(tài)運(yùn)行時(shí)語言是什么意思?
答案:多態(tài)迅脐。 主要是將數(shù)據(jù)類型的確定由編譯時(shí),推遲到了運(yùn)行時(shí)芍殖。
這個(gè)問題其實(shí)淺涉及到兩個(gè)概念,運(yùn)行時(shí)和多態(tài)。
簡(jiǎn)單來說,運(yùn)行時(shí)機(jī)制使我們直到運(yùn)行時(shí)才去決定一個(gè)對(duì)象的類別,以及調(diào)用該類別對(duì)象指定方法谴蔑。
多態(tài):不同對(duì)象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)豌骏。意思就是假設(shè)生物類(life)都用有一個(gè)相同的方法-eat;
那人類屬于生物,豬也屬于生物,都繼承了life后,實(shí)現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法龟梦。
也就是不同的對(duì)象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個(gè)選擇器)。
因此也可以說,運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ)?
10窃躲、Objective-C堆和棧的區(qū)別?
管理方式:對(duì)于棧來講,是由編譯器自動(dòng)管理,無需我們手工控制;對(duì)于堆來說,釋放工作由程序員控制,容易產(chǎn)生memory leak计贰。
申請(qǐng)大小:
棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個(gè)編譯時(shí)就確定的常數(shù)),如果申請(qǐng)的空間超過棧的剩余空間時(shí),將提示overflow蒂窒。因 此,能從棧獲得的空間較小躁倒。
堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲(chǔ)的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址洒琢。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存秧秉。由此可見,堆獲得的空間比較靈活,也比較大。
碎片問題:對(duì)于堆來講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低衰抑。對(duì)于棧來講,則不會(huì)存在這個(gè)問題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出
分配方式:堆都是動(dòng)態(tài)分配的,沒有靜態(tài)分配的堆象迎。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配呛踊。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無需我們手工實(shí)現(xiàn)砾淌。
分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫提供的,它的機(jī)制是很復(fù)雜的谭网。
以上就是10個(gè)面試者經(jīng)常會(huì)碰到的Objective-C基礎(chǔ)面試題,如果你正好要去應(yīng)聘iOS崗位那么請(qǐng)回到文章開始重新認(rèn)真閱讀吧拇舀。iOS開發(fā)還是相對(duì)比較有前途的,大家覺得呢?
棧鏈的C語言實(shí)現(xiàn)
iOS基礎(chǔ):retain,copy,assign及autorelease
相關(guān)資訊
Objective-C
Objective-C枚舉的幾種定義方式與 (今 08:32)
Ubuntu下如何安裝并使用Objective- (12/13/2015 16:21:07)
Objective-C如何自己實(shí)現(xiàn)一個(gè)for- (12/13/2015 16:17:25)
Objective-C中runtime機(jī)制的應(yīng)用 (01月13日)
Objective-C如何自己實(shí)現(xiàn)一個(gè)基于 (12/13/2015 16:18:53)
Objective-C語言中nil、Nil蜻底、NULL (12/05/2015 22:53:39)
本文評(píng)論
查看全部評(píng)論 (0)
表情:
姓名:
匿名
字?jǐn)?shù)
同意評(píng)論聲明
評(píng)論聲明
尊重網(wǎng)上道德,遵守中華人民共和國(guó)的各項(xiàng)有關(guān)法律法規(guī)
承擔(dān)一切因您的行為而直接或間接導(dǎo)致的民事或刑事法律責(zé)任
本站管理人員有權(quán)保留或刪除其管轄留言中的任意內(nèi)容
本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用您的評(píng)論
參與本評(píng)論即表明您已經(jīng)閱讀并接受上述條款
最新資訊
Objective-C枚舉的幾種定義方式與使用
VMware虛擬機(jī)安裝Ubuntu并設(shè)置root登陸
Linux系統(tǒng)修改PATH環(huán)境變量方法
Ubuntu系統(tǒng)環(huán)境變量詳解
Linux 下 Python 實(shí)現(xiàn)按任意鍵退出
通過網(wǎng)線直接連接樹莓派和電腦實(shí)現(xiàn)樹莓派共
從源代碼到可執(zhí)行文件——編譯全過程解析
樹莓派在沒有顯示器情況下查找未知IP教程
Linux上實(shí)現(xiàn)樹莓派的交叉編譯及文件傳輸,遠(yuǎn)
Linux下使用交叉編譯移植U-Boot到樹莓派
背景:
閱讀新聞
iOS基礎(chǔ):retain,copy,assign及autorelease
[日期:2013-07-15]
來源:Linux社區(qū)
作者:martin1009
[字體:大 中 小]
一,retain, copy, assign區(qū)別
1. 假設(shè)你用malloc分配了一塊內(nèi)存,并且把它的地址賦值給了指針a,后來你希望指針b也共享這塊內(nèi)存,于是你又把a(bǔ)賦值給(assign)了b骄崩。此時(shí)a 和b指向同一塊內(nèi)存,請(qǐng)問當(dāng)a不再需要這塊內(nèi)存,能否直接釋放它?答案是否定的,因?yàn)閍并不知道b是否還在使用這塊內(nèi)存,如果a釋放了,那么b在使用這塊內(nèi)存的時(shí)候會(huì)引起程序crash掉。
2. 了解到1中assign的問題,那么如何解決?最簡(jiǎn)單的一個(gè)方法就是使用引用計(jì)數(shù)(reference counting),還是上面的那個(gè)例子,我們給那塊內(nèi)存設(shè)一個(gè)引用計(jì)數(shù),當(dāng)內(nèi)存被分配并且賦值給a時(shí),引用計(jì)數(shù)是1薄辅。當(dāng)把a(bǔ)賦值給b時(shí)引用計(jì)數(shù)增加到 2要拂。這時(shí)如果a不再使用這塊內(nèi)存,它只需要把引用計(jì)數(shù)減1,表明自己不再擁有這塊內(nèi)存。b不再使用這塊內(nèi)存時(shí)也把引用計(jì)數(shù)減1站楚。當(dāng)引用計(jì)數(shù)變?yōu)?的時(shí)候,代表該內(nèi)存不再被任何指針?biāo)?系統(tǒng)可以把它直接釋放掉脱惰。
3. 上面兩點(diǎn)其實(shí)就是assign和retain的區(qū)別,assign就是直接賦值,從而可能引起1中的問題,當(dāng)數(shù)據(jù)為int, float等原生類型時(shí),可以使用assign。retain就如2中所述,使用了引用計(jì)數(shù),retain引起引用計(jì)數(shù)加1, release引起引用計(jì)數(shù)減1,當(dāng)引用計(jì)數(shù)為0時(shí),dealloc函數(shù)被調(diào)用,內(nèi)存被回收窿春。
4. copy是在你不希望a和b共享一塊內(nèi)存時(shí)會(huì)使用到拉一。a和b各自有自己的內(nèi)存。
5. atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作旧乞。在多線程環(huán)境下,原子操作是必要的,否則有可能引起錯(cuò)誤的結(jié)果蔚润。加了atomic,setter函數(shù)會(huì)變成下面這樣:
if (property != newValue) {
[property release];
property = [newValue retain];
}
二,深入理解一下(包括autorelease)
1. retain之后count加一。alloc之后count就是1,release就會(huì)調(diào)用dealloc銷毀這個(gè)對(duì)象尺栖。
如果 retain,需要release兩次嫡纠。通常在method中把參數(shù)賦給成員變量時(shí)需要retain。
例如:
ClassA有 setName這個(gè)方法:
-(void)setName:(ClassName *) inputName
{
name=inputName;
[name retain]; //此處retian,等同于[inputName retain],count等于2
}
調(diào)用時(shí):
ClassName *myName=[[ClassName alloc] init];
[classA setName:myName]; //retain count==2
[myName release]; //retain count==1,在ClassA的dealloc中release name才能真正釋放內(nèi)存。
2. autorelease 更加tricky,而且很容易被它的名字迷惑除盏。我在這里要強(qiáng)調(diào)一下:autorelease不是garbage collection,完全不同于Java或者.Net中的GC叉橱。
autorelease和作用域沒有任何關(guān)系!
autorelease 原理:
a.先建立一個(gè)autorelease pool
b.對(duì)象從這個(gè)autorelease pool里面生成。
c.對(duì)象生成 之后調(diào)用autorelease函數(shù),這個(gè)函數(shù)的作用僅僅是在autorelease pool中做個(gè)標(biāo)記,讓pool記得將來release一下這個(gè)對(duì)象者蠕。
d.程序結(jié)束時(shí),pool本身也需要rerlease, 此時(shí)pool會(huì)把每一個(gè)標(biāo)記為autorelease的對(duì)象release一次窃祝。如果某個(gè)對(duì)象此時(shí)retain count大于1,這個(gè)對(duì)象還是沒有被銷毀。
上面這個(gè)例子應(yīng)該這樣寫:
ClassName *myName=[[[ClassName alloc] init] autorelease];//標(biāo)記為autorelease
[classA setName:myName]; //retain count==2
[myName release]; //retain count==1,注意,在ClassA的dealloc中不能release name,否則release pool時(shí)會(huì)release這個(gè)retain count為0的對(duì)象,這是不對(duì)的踱侣。
記住一點(diǎn):如果這個(gè)對(duì)象是你alloc或者new出來的,你就需要調(diào)用release锌杀。如果使用autorelease,那么僅在發(fā)生過retain的時(shí)候release一次(讓retain count始終為1)。
10個(gè)Objective-C基礎(chǔ)面試題,iOS面試必備
Android HttpClient的幾個(gè)超時(shí)時(shí)間
相關(guān)資訊
iOS基礎(chǔ)
本文評(píng)論
查看全部評(píng)論 (0)
表情:
姓名:
匿名
字?jǐn)?shù)
同意評(píng)論聲明
評(píng)論聲明
尊重網(wǎng)上道德,遵守中華人民共和國(guó)的各項(xiàng)有關(guān)法律法規(guī)
承擔(dān)一切因您的行為而直接或間接導(dǎo)致的民事或刑事法律責(zé)任
本站管理人員有權(quán)保留或刪除其管轄留言中的任意內(nèi)容
本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用您的評(píng)論
參與本評(píng)論即表明您已經(jīng)閱讀并接受上述條款
最新資訊
CentOS 6.4下雙網(wǎng)卡bond配置
CentOS6.x雙網(wǎng)卡采用主-備份策略綁定(bond
ORA-30036故障解決方法案例
ORA-03114: 未連接到 ORALCE 解決方法案例
Oracle RAC系統(tǒng)內(nèi)存無法釋放解決
Oracle Goldengate在HP平臺(tái)裸設(shè)備文件系統(tǒng)
OGG升級(jí)運(yùn)行g(shù)gsic報(bào)Unable to find library
Linux vi命令大全
VMware虛擬機(jī)主機(jī)模式下與主機(jī)互ping通
Linux內(nèi)核中container_of函數(shù)詳解