1 #import與#include的區別,@class代表什麼?
答:#import比起#include的好處就是不會引起交叉編譯。在 oc中#import 被當成 #include 指令的改良版本來使用。除此之外,#import 確定乙個檔案只能被匯入一次,這使你在遞迴包含中不會出現問題。一般來說,在匯入 objective-c 標頭檔案的時候使用 #import,包含 c 標頭檔案時使用 #include。
@class是用來做類引用的。
@class就是告訴編譯器有這麼乙個類,至於類的定義是啥不知道
@class一般用於標頭檔案中需要宣告該類的某個例項變數的時候用到,在m檔案中還是需要使用#import
2 深拷貝和淺拷貝區別是什麼?
答:淺拷貝:只複製物件的指標,而不會複製物件的記憶體;深拷貝:複製引用物件本身,意思就是說我有乙個a物件,複製乙份就會得到a_copy物件,而淺拷貝複製出來的a_copy物件後和a指向的是同乙個記憶體位址,而不會再開闢乙個記憶體物件。 用乙個通俗的話就是,深拷貝就是你的複製人,你掛了,人還在。淺拷貝就是你的影子,你掛了,影子就不在了。
3 oc中類別和類擴充套件有什麼區別?
答: 1.類擴充套件(class extension也有人稱為匿名分類)能為某個類附加額外的屬性,成員變數,方法宣告。一般類擴充套件都寫在.m檔案中,一般的私有屬性都在類擴充套件中。類擴充套件的使用格式:
@inte***ce
mitchell()
//屬性
//方法
@end
2.分類(category):分類中的小括號中必須有名字,分類只能擴充套件方法,不能擴充套件屬性和成員變數。分類可以在不獲悉,不改變原來**的情況下往裡面新增新的方法,只能新增不能刪除和修改。並且如果類別和原來類中的方法產生名衝突,則類別將覆蓋原來的方法,因為類別有更高的優先順序。分類的使用格式:
@inte***ce 類名(分類名字)
/*方法宣告*/
@end
@implementation類名(分類名字)
/*方法實現*/
@end
4 oc中堆和棧的區別?
答:管理方式上:對於棧來說, 是由編譯器自動管理,無需我們手工去控制。對於堆來來講,釋放工作由程式設計師控制,容易產生記憶體洩漏。
申請大小:棧是向低位址擴充套件的資料結構,是一塊連續的記憶體區域。棧上的位址的最大容量是系統預先規定好的,一般大小為2m,如果申請的空間超過了棧的剩餘空間的時候,就overflow。因些有獲得的棧的空間比較小;堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用鍊錶來儲存的空閒記憶體位址,自然這區域是不連續的,而鍊錶的遍歷方向是由低位址向高位址。堆的大小受限於計算機系統中有效的虛擬記憶體,堆獲得的空間比較靈活也比較大
碎片的問題:對於堆來講,頻繁的alloc/new會造成記憶體的不連續,從而造成碎片的產生,使程式效率比較低。對於棧來說,不會存在這個問題,因為棧是先進後出的佇列,是一一對應的。
分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有兩種分配方式:靜態分配和動態分配,靜態分配是編譯器完成的,比如區域性變數的分配。動態分配是有alloc函式進行分配的,但是棧的動態分配和堆是不同的,他的動態分配由編譯器進行釋放,無需我們手工實現。
分配效率:棧是機器系統提供的資料結構,計算機會在第層堆疊提供支援,分配專門暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是c/c++函式庫提供的,他的機制是很複雜的。
5 記憶體管理的幾個原則是什麼?
答: 1.釋放由alloc方法建立的物件,copy和mutablecopy方法複製的物件,以及手動呼叫retain的物件。alloc方法會建立乙個新的物件,並將物件的保留計數置為1。copy和mutablecopy方法會建立乙個物件的副本,並將其保留計數置為1。手動呼叫retain會導致物件的保留計數加1,目的是保證該物件在使用過程中不會被**。這三種方式都需要我們手動呼叫release進行釋放。
2.自動釋放的物件不需要呼叫release,因為已經將釋放的責任轉交給自動釋放池。
3誰申請誰釋放。如果獲得了乙個其他方法提供的物件,則不需要考慮該物件的記憶體管理問題。但是,如果你想要在一段時間內使用該物件,則需要保留該物件,並在使用後將其釋放(防止釋放在使用時被釋放)
6 @property本質是什麼?
答:@proerty宣告乙個屬性,會自動給這個屬性新增get,set方法。與其配合的乙個@synthesize 屬性。
-(nsstring *) name
-(void) setname:(nsstrng *) newname}
7 delegate用什麼屬性修飾?為什麼?
答:delegate要用weak或者assing修飾,不能用strong或者retain修飾。乙個物件沒必要管理自己delegate的生命週期,或者說沒必要擁有該物件,所以我們只要知道它的指標就可以了,用指標找到物件去呼叫方法,也就是委託實現的感覺。或者我們換個角度,從記憶體管理方面也可以解釋這個問題。delegate的生命週期不需要讓該物件去控制,如果該物件對其使用retain很可能導致delegate所指向的物件無法正確的釋放。我們常見的delegate往往是assign方式的屬性而不是retain方式的屬性,賦值不會增加引用計數,就是為了防止delegation兩端產生不必要的迴圈引用。如果乙個uitableviewcontroller 物件a通過retain獲取了uitableview物件b的所有權,這個uitableview物件b的delegate又是a, 如果這個delegate是retain方式的,那基本上就沒有機會釋放這兩個物件了
8 block用什麼屬性修飾?為什麼?
答:block一開始是放在棧上的,只有copy後才會放到堆上。如果不加copy屬性,當其所在棧被釋放的時候,這些本地變數將變得不可訪問。一旦**執行到block這段就會導致bad access。但是用copy會帶來另乙個問題,就是self的引用計數+1。這意味著很可能會導致迴圈引用。解決迴圈引用的方法就是用__weak去修飾物件。
10道MySQL常見面試題
1 mysql索引種類 1.普通索引 2.唯一索引 3.主鍵索引 4.組合索引 5.全文索引 2 索引在什麼情況下遵循最左字首的規則?最左字首原理的一部分,索引index1 a,b,c 只會走a a,b a,b,c 三種型別的查詢,其實這裡說的有一點問題,a,c也走,但是只走a欄位索引,不會走c欄位...
分享10道RabbitMQ相關面試題!!!
1 解耦 如果多個模組或者系統中,互相呼叫很複雜,維護起來比較麻煩,但是這個呼叫 又不是同步呼叫,就可以運用 mq 到這個業務中。2 非同步 這個很好理解,比如使用者的操作日誌的維護,可以不用同步處理,節約響應時間。3 削峰 在高峰期的時候,系統每秒的請求量達到 5000,那麼呼叫 mysql 的請...
三道面試題
一 給定乙個n個整數元素的陣列,元素分別為a1,a2,a3.an,每個元素分別對應乙個權重w1 小於1的float w2,w3.wn,其和為1,找出其中乙個元素ak,使所有小於ak的元素的權重之和小於1 2,所有大於ak的元素的權重之和 1 2。思路 首先將該陣列按元素值的大小進行公升序排列,同樣的...