1、#import和#include的區(qū)別,@class代表什么?
@class一般用于頭文件中需要聲明該類的某個實例變量的時候用到,在m文件中還是需要使用#import
而#import比起#include的好處就是不會引起重復包含
2、談談Object-C的內(nèi)存管理方式及過程?
1.當你使用new,alloc和copy方法創(chuàng)建一個對象時,該對象的保留計數(shù)器值為1.當你不再使用該對象時,你要負責向該對象發(fā)送一條release或autorelease消息.這樣,該對象將在使用壽命結束時被銷毀.
2.當你通過任何其他方法獲得一個對象時,則假設該對象的保留計數(shù)器值為1,而且已經(jīng)被設置為自動釋放,你不需要執(zhí)行任何操作來確保該對象被清理.如果你打算在一段時間內(nèi)擁有該對象,則需要保留它并確保在操作完成時釋放它.
3.如果你保留了某個對象,你需要(最終)釋放或自動釋放該對象.必須保持retain方法和release方法的使用次數(shù)相等.
3、Object-C有私有方法嗎?私有變量呢?
objective-c?–?類里面的方法只有兩種,?靜態(tài)方法和實例方法.?這似乎就不是完整的面向?qū)ο罅?按照OO的原則就是一個對象只暴露有用的東西.?如果沒有了私有方法的話,?對于一些小范圍的代碼重用就不那么順手了.?在類里面聲名一個私有方法
? ? @interface?Controller?:?NSObject?{?NSString?*something;?}
? ?+?(void)thisIsAStaticMethod;
? ?–?(void)thisIsAnInstanceMethod;
? ?@end
@interface?Controller?(private)?-
(void)thisIsAPrivateMethod;
@end
@private可以用來修飾私有變量
在Objective‐C中,所有實例變量默認都是私有的,所有實例方法默認都是公有的
4、Object-C有多繼承嗎?沒有的話用什么代替?cocoa?中所有的類都是NSObject?的子類
多繼承在這里是用protocol?委托代理?來實現(xiàn)的
你不用去考慮繁瑣的多繼承?,虛基類的概念.
ood的多態(tài)特性?在?obj-c?中通過委托來實現(xiàn).
5、內(nèi)存管理?Autorelease、retain、copy、assign的set方法和含義?
1,你初始化(alloc/init)的對象,你需要釋放(release)它。例如:
NSMutableArray?aArray?=?[[NSArray?alloc]?init]; 后,需要 [aArray?release];
2,你retain或copy的,你需要釋放它。例如:
[aArray?retain] 后,需要 [aArray?release];
3,被傳遞(assign)的對象,你需要斟酌的retain和release。例如:
obj2?=?[[obj1?someMethod]?autorelease];
對象2接收對象1的一個自動釋放的值,或傳遞一個基本數(shù)據(jù)類型(NSInteger,NSString)時:你或希望將對象2進行retain,以防止它在被使用之前就被自動釋放掉。但是在retain后,一定要在適當?shù)臅r候進行釋放。
關于索引計數(shù)(Reference?Counting)的問題
retain值?=?索引計數(shù)(Reference?Counting)
NSArray對象會retain(retain值加一)任何數(shù)組中的對象。當NSArray被卸載(dealloc)的時候,所有數(shù)組中的對象會 被 執(zhí)行一次釋放(retain值減一)。不僅僅是NSArray,任何收集類(Collection?Classes)都執(zhí)行類似操作。例如 NSDictionary,甚至UINavigationController。
Alloc/init建立的對象,索引計數(shù)為1。無需將其再次retain。
[NSArray?array]和[NSDate?date]等“方法”建立一個索引計數(shù)為1的對象,但是也是一個自動釋放對象。所以是本地臨時對象,那么無所謂了。如果是打算在全Class中使用的變量(iVar),則必須retain它。
缺省的類方法返回值都被執(zhí)行了“自動釋放”方法。(*如上中的NSArray)
在類中的卸載方法“dealloc”中,release所有未被平衡的NS對象。(*所有未被autorelease,而retain值為1的)
6、淺拷貝和深拷貝區(qū)別是什么
簡單的來說就是,在有指針的情況下,淺拷貝只是增加了一個指針指向已經(jīng)存在的內(nèi)存,而深拷貝就是增加一個指針并且申請一個新的內(nèi)存,使這個增加的指針指向這個新的內(nèi)存,采用深拷貝的情況下,釋放內(nèi)存的時候就不會出現(xiàn)在淺拷貝時重復釋放同一內(nèi)存的錯誤
7、C和obj-c?如何混用
1)obj-c的編譯器處理后綴為m的文件時,可以識別obj-c和c的代碼,處理mm文件可以識別obj-c,c,c++代碼,但cpp文件必須只能用c/c++代碼,而且cpp文件include的頭文件中,也不能出現(xiàn)obj-c的代碼,因為cpp只是cpp
2)在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是問題
3)在cpp中混用obj-c其實就是使用obj-c編寫的模塊是我們想要的。
如果模塊以類實現(xiàn),那么要按照cpp?class的標準寫類的定義,頭文件中不能出現(xiàn)obj-c的東西,包括#import?cocoa的。實現(xiàn)文件中,即類的實現(xiàn)代碼中可以使用obj-c的東西,可以import,只是后綴是mm。
如果模塊以函數(shù)實現(xiàn),那么頭文件要按c的格式聲明函數(shù),實現(xiàn)文件中,c++函數(shù)內(nèi)部可以用obj-c,但后綴還是mm或m。
總結:只要cpp文件和cpp?include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關鍵是使用接口,而不能直接使用 實現(xiàn)代 碼,實際上cpp混用的是obj-c編譯后的o文件,這個東西其實是無差別的,所以可以用。obj-c的編譯器支持cpp
8、Objective-C中類別和類擴展的區(qū)別。
答案:category和extensions的不同在于后者可以添加屬性。另外后者添加的方法是必須要實現(xiàn)的。
extensions可以認為是一個私有的Category。
9、我們說的Objective-C是動態(tài)運行時語言是什么意思?
答案:多態(tài)。?主要是將數(shù)據(jù)類型的確定由編譯時,推遲到了運行時。
這個問題其實淺涉及到兩個概念,運行時和多態(tài)。
簡單來說,運行時機制使我們直到運行時才去決定一個對象的類別,以及調(diào)用該類別對象指定方法。
多態(tài):不同對象以自己的方式響應相同的消息的能力叫做多態(tài)。意思就是假設生物類(life)都用有一個相同的方法-eat;
那人類屬于生物,豬也屬于生物,都繼承了life后,實現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法。
也就是不同的對象以自己的方式響應了相同的消息(響應了eat這個選擇器)。
因此也可以說,運行時機制是多態(tài)的基礎?
10、Objective-C堆和棧的區(qū)別?
管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產(chǎn)生memory?leak。
申請大?。?/p>
棧:在Windows下,棧是向低地址擴展的數(shù)據(jù)結構,是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預先規(guī)定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時,將提示overflow。因 此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數(shù)據(jù)結構,是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。
碎片問題:對于堆來講,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題,因為棧是先進后出的隊列,他們是如此的一一對應,以至于永遠都不可能有一個內(nèi)存塊從棧中間彈出
分配方式:堆都是動態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動態(tài)分配由alloca函數(shù)進行分配,但是棧的動態(tài)分配和堆是不同的,他的動態(tài)分配是由編譯器進行釋放,無需我們手工實現(xiàn)。
分配效率:棧是機器系統(tǒng)提供的數(shù)據(jù)結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫提供的,它的機制是很復雜的。
以上就是10個面試者經(jīng)常會碰到的Objective-C基礎面試題,如果你正好要去應聘iOS崗位那么請回到文章開始重新認真閱讀吧。iOS開發(fā)還是相對比較有前途的,大家覺得呢?