1. 程式人生 > >iOS 技術點總結筆記

iOS 技術點總結筆記

1.為什麼說Objective-C是一門動態的語言? 1.object-c類的型別和資料變數的型別都是在執行是確定的,而不是在編譯時確定。例如:多型特性,我們可以使用父類物件來指向子類物件,並且可以用來呼叫子類的方法。執行時(runtime)特性,我們可以動態的新增方法,或者替換方法。 2.講一下MVC和MVVM,MVP? MVC:簡單來說就是,邏輯、試圖、資料進行分層,實現解耦。 MVVM:是Model-View-ViewMode模式的簡稱。由檢視(View)、檢視模型(ViewModel)、模型(Model)三部分組成.比MVC更加釋放控制器臃腫,M、V、VM直接是通過訊號來傳遞訊息或者資料,本小編將他們直接的通訊理解為通知
,一下為MVVM的特點:
  1. 低耦合。View可以獨立於Model變化和修改,一個ViewModel可以繫結到不同的View上,當View變化的時候Model可以不變,當Model變化的時候View也可以不變。
  2. 可重用性。可以把一些檢視的邏輯放在ViewModel裡面,讓很多View重用這段檢視邏輯。
  3. 獨立開發。開發人員可以專注與業務邏輯和資料的開發(ViewModel)。設計人員可以專注於介面(View)的設計。
  4. 可測試性。可以針對ViewModel來對介面(View)進行測試
MVP:本小編沒有接觸,希望可以得到大家的幫助。可以在下面留言。 3.為什麼代理要用weak?代理的delegate和dataSource有什麼區別?block和代理的區別?
代理是使用weak來修飾的。1.使用weak是為了避免迴圈引用。2.當使用weak修飾的屬性,當物件釋放的時候,系統會對屬性賦值nil,object-c有個特性就是對nil物件傳送訊息也就是呼叫方法,不會cash。 delegate:表示代理,代理可以讓A物件通知B物件,我(A)發生的變化,前提B遵循了A的代理,並且實現了A的代理方法。 dataSource:表示資料來源,如果A物件聲明瞭資料來源,當我們建立A物件的時候,我們就該實現資料來源,來告訴A,他所需要的一些資料。例如:tableView資料來源方法,需要告訴它,我要實現幾組cell,每組cell多少行cell,實現的cell什麼樣式,什麼內容 同樣delegate
dataSource,都是可以使用requireoptional來修飾的。 代理和Block的區別 相同點:代理和Block大多是我們都可以用來做倒序傳值的。我們都得注意避免迴圈引用。 不同點:代理使用weak修飾,代理必須先宣告方法。當我們呼叫代理的時候要判斷是否已經實現。 block:使用的是copy來修飾,block儲存的是一段程式碼,其實也就是一個函式。當我們呼叫block的時候要判斷是否已經實現。 4.屬性的實質是什麼?包括哪幾個部分?屬性預設的關鍵字都有哪些?@dynamic關鍵字和@synthesize關鍵字是用來做什麼的? 屬性是描述類的特徵,也就是具備什麼特性。三個部分,帶下劃線的成員變數,get、setter方法。 預設關鍵字:readwrite,assign, atomic; @dynamic :修飾的屬性,其getter和setter方法編譯器是不會自動幫你生成。必須自己是實現的。 @synthesize:修飾的屬性,其getter和setter方法編譯器是會自動幫你生成。不必自己實現,可以指定與屬性相對應的成員變數。 5.屬性的預設關鍵字是什麼? 預設關鍵字:readwrite,assign, atomic; 6.NSString為什麼要用copy關鍵字,如果用strong會有什麼問題?(注意:這裡沒有說用strong就一定不行。使用copy和strong是看情況而定的 眾所周知,我們知道,可變型別(NSMutableArray,NSMutableString等)是不可邊型別(NSString,NSArray等)的子類,因為多型的原因,我們可以使用賦值指向子類物件,也就是我們可以使用不可邊型別去接受可變型別。 1.當我們使用strong修飾A不可邊型別的時候,並且使用B可變型別給A賦值,再去修改可變型別B值的時候,A所指向的值也會發生改變。引文strong只是讓建立的物件引用計數器+1,並返回當前物件的內容地址,當我們修改B指向的內容的時候,A指向的內容也同樣發生了改變,因為他們指向的記憶體地址是相同的,是一份內容。 2.當我們使用copy修飾A不可邊型別的時候,並且使用B可變型別給A賦值,再去修改可變型別B值的時候,A所指向的值不會發生改變。因為當時用copy的修飾的時候,會拷貝一份內容出來,並且返回指標給A,當我們修改B指向的內容的時候,A指向的內容是沒有發生改變的。因為A指向的記憶體地址和B指向的記憶體地址是不相同的,是兩份內容 3.copy修飾不可邊型別(NSString,NSArray等)的時候,表示淺拷貝,只拷貝一份指標,和strong修飾一樣,當修飾的是可變型別(NSMutableArray,NSMutableString等)的時候,表示深拷貝,直接拷貝新一份內容,到記憶體中。表示兩份內容。 7.如何令自己所寫的物件具有拷貝功能? 必須遵循nscopying協議,如果想實現可變和不可邊拷貝時,必須同時遵循nscopingnsmutablecoping協議。並且實現 - (id)copyWithZone:(NSZone *)zone; 8.可變集合類 和 不可變集合類的 copy 和 mutablecopy有什麼區別?如果是集合是內容複製的話,集合裡面的元素也是內容複製麼? 可變使用copy表示深拷貝,不可變集合類使用copy的時候是淺拷貝。 可變集合類使用mutablecopy表示深拷貝,不可變集合類使用copy的時候是淺拷貝。 關於容器實現copy 或 metableCopy ,容器內元素預設都是 指標拷貝,不是內容複製。 9.為什麼IBOutlet修飾的UIView也適用weak關鍵字? 在xib或者Sb拖控制元件時,其實控制元件就載入到了父控制元件的subviews數組裡面,進行了強引用,即使使用了weak,也不造成物件的釋放。 10.nonatomic和atomic的區別?atomic是絕對的執行緒安全麼?為什麼?如果不是,那應該如何實現? nonatomic:表示非原子,不安全,但是效率高。 atomic:表示原子行,安全,但是效率定。 atomic:不能絕對保證執行緒的安全,當多執行緒同時訪問的時候,會造成執行緒不安全。可以使用執行緒鎖來保證執行緒的安全。 11.UICollectionView自定義layout如何實現? 實現一個自定義layout的常規做法是繼承UICollectionViewLayout類,然後過載下列方法: -(CGSize)collectionViewContentSize返回collectionView的內容的尺寸-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect返回rect中的所有的元素的佈局屬性返回的是包含UICollectionViewLayoutAttributes的NSArrayUICollectionViewLayoutAttributes可以是cell,追加檢視或裝飾視 圖的資訊,通過不同的UICollectionViewLayoutAttributes初始化方法可以得到不同型別的UICollectionViewLayoutAttributes: layoutAttributesForCellWithIndexPath: layoutAttributesForSupplementaryViewOfKind:withIndexPath:layoutAttributesForDecorationViewOfKind:withIndexPath: -(UICollectionViewLayoutAttributes )layoutAttributesForItemAtIndexPath:(NSIndexPath )indexPath返回對應於indexPath的位置的cell的佈局屬性-(UICollectionViewLayoutAttributes )layoutAttributesForSupplementaryViewOfKind:(NSString )kind atIndexPath:(NSIndexPath *)indexPath返回對應於indexPath的位置的追加檢視的佈局屬性,如果沒有追加檢視可不過載-(UICollectionViewLayoutAttributes * )layoutAttributesForDecorationViewOfKind:(NSString)decorationViewKind atIndexPath:(NSIndexPath )indexPath返回對應於indexPath的位置的裝飾檢視的佈局屬性,如果沒有裝飾檢視可不過載-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds當邊界發生改變時,是否應該重新整理佈局。如果YES則在邊界變化(一般是scroll到其他地方)時,將重新計算需要的佈局資訊。 12.用StoryBoard開發介面有什麼弊端?如何避免? 使用簡單邏輯頁面的跳轉是可以使用sb的,開發比較塊。 但是SB對於邏輯專案比較複雜的時候,開發起來比較慢。不適合多人合作開發;也不利於版本的梗系和後期的維護。使用sb在專案變異編譯的時候,也都會直接載入到記憶體中,造成記憶體的浪費。 可以使用xib來代替,編輯複雜邏輯介面時候可以使用純碼編寫。 13.程序和執行緒的區別?同步非同步的區別?並行和併發的區別? 程序:是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位. 執行緒:是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源. 同步:只在同一個執行緒內部執行任務。 非同步:可以開闢執行緒來執行任務。 併發:當有多個執行緒在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的執行緒,它只能把CPU執行時間劃分成若干個時間段,再將時間 段分配給各個執行緒執行,在一個時間段的執行緒程式碼執行時,其它執行緒處於掛起狀。.這種方式我們稱之為併發(Concurrent)。 並行:當系統有一個以上CPU時,則執行緒的操作有可能非併發。當一個CPU執行一個執行緒時,另一個CPU可以執行另一個執行緒,兩個執行緒互不搶佔CPU資源,可以同時進行,這種方式我們稱之為並行(Parallel)。 區別:併發和並行是即相似又有區別的兩個概念,並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔內發生。在多道程式環境下,併發性是指在一段時間內巨集觀上有多個程式在同時執行,但在單處理機系統中,每一時刻卻僅能有一道程式執行,故微觀上這些程式只能是分時地交替執行。倘若在計算機系統中有多個處理機,則這些可以併發執行的程式便可被分配到多個處理機上,實現並行執行,即利用每個處理機來處理一個可併發執行的程式,這樣,多個程式便可以同時執行。 14.執行緒間通訊? 當使用dispath-async函式開闢執行緒執行任務的完成時,我們需要使用dispatch_async(dispatch_get_main_queue(), ^{ });函式會到主執行緒內重新整理UI。並完成通訊 15.GCD的一些常用的函式?(group,barrier,訊號量,執行緒同步) 我們使用佇列組來開闢執行緒時,佇列組中的佇列任務是併發,當所有的佇列組中的所有任務完成時候,才可以呼叫佇列組完成任務。 /**建立自己的佇列*/dispatch_queue_t dispatchQueue = dispatch_queue_create("ted.queue.next", DISPATCH_QUEUE_CONCURRENT);/**建立一個佇列組*/dispatch_group_t dispatchGroup = dispatch_group_create();/**將佇列任務新增到佇列組中*/dispatch_group_async(dispatchGroup, dispatchQueue, ^(){ NSLog(@"dispatch-1");}); /**將佇列任務新增到佇列組中*/dispatch_group_async(dispatchGroup, dispatchQueue, ^(){ NSLog(@"dspatch-2");}); /**佇列組完成呼叫函式*/dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){ NSLog(@"end");}) barrier:表示柵欄,當在併發佇列裡面使用柵欄時候,柵欄之前的併發任務開始併發執行,執行完畢後,執行柵欄內的任務,等柵欄任務執行完畢後,再併發執行柵欄後的任務。 dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);dispatch_async(concurrentQueue, ^(){ NSLog(@"dispatch-1");});dispatch_async(concurrentQueue, ^(){ NSLog(@"dispatch-2");});dispatch_barrier_async(concurrentQueue, ^(){ NSLog(@"dispatch-barrier"); });dispatch_async(concurrentQueue, ^(){ NSLog(@"dispatch-3");});dispatch_async(concurrentQueue, ^(){ NSLog(@"dispatch-4");}); 訊號量:Semaphore是通過‘計數’的方式來標識執行緒是否是等待或繼續執行的。訊號量 dispatch_semaphore_create(int) // 建立一個訊號,並初始化訊號的計數大小/* 等待訊號,並且判斷訊號量,如果訊號量計數大於等於你建立時候的訊號量的計數,就可以通過,繼續執行,並且將你傳入的訊號計數減1, * 如果傳入的訊號計數小於你建立的計數,就表示等待,等待訊號計數的變化 * 如果等待的時間超過你傳入的時間,也會繼續下面操作 * 第一個引數:semaphore 表示訊號量 * 第二個引數:表示等待的時間 * 返回int 如果傳入的訊號計數大於等於你建立訊號的計數時候,返回0. 反之,返回的不等於0 */ int result = dispatch_semaphore_wait(dispatch_semaphore_t semaphore,time outTime);// 表示等待,也是阻礙執行緒// 表示將訊號技術+1dispatch_semaphore_signl(dispatch_semaphore_t semaphore); 實現執行緒的同步的方法:序列佇列,分組,訊號量。也是可以使用併發佇列。 //加入佇列dispatch_async(concurrentQueue, ^{ //1.先去網上下載圖片 dispatch_sync(concurrentQueue, ^{ }); //2.在主執行緒展示到介面裡 dispatch_sync(dispatch_get_main_queue(), ^{ });}); 16.如何使用佇列來避免資源搶奪? 當我們使用多執行緒來訪問同一個資料的時候,就有可能造成資料的不準確性。這個時候我麼可以使用執行緒鎖的來來繫結。也是可以使用序列佇列來完成。如:fmdb就是使用FMDatabaseQueue,來解決多執行緒搶奪資源。 17.資料持久化的幾個方案(fmdb用沒用過) 持久化方案: plist,儲存字典,陣列比較好用 preference:偏好設定,實質也是plist NSKeyedArchiver:歸檔,可以儲存物件 sqlite:資料庫,經常使用第三方來操作,也就是fmdb coreData:也是資料庫儲存,蘋果官方的 18.說一下appdelegate的幾個方法?從後臺到前臺呼叫了哪些方法?第一次啟動呼叫了哪些方法?從前臺到後臺呼叫了哪些方法? 1029210 (1).gif 19.NSCache優於NSDictionary的幾點? 1.nscache 是可以自動釋放記憶體的。 2.nscache是執行緒安全的,我們可以在不同的執行緒中新增,刪除和查詢快取中的物件。 3.一個快取物件不會拷貝key物件。 20.知不知道Designated Initializer?使用它的時候有什麼需要注意的問題? 個人理解:初始化函式,如果你想自定義初始化函式時,也是必須要初始化父類,以來保證可以繼承父類的一些方法或者屬性。 21.實現description方法能取到什麼效果? description是nsobject的一個例項的方法,返回的是一個nsstring。當我們使用nslog列印的時候,打印出來的一般都是物件的記憶體地址,如果我們實現description方法時,我們就可以使用nslog列印物件的時候,我們可以把它裡面的屬性值和記憶體地址一起打印出來.列印什麼,就是看你寫什麼了。 -(NSString *)description{ NSString * string = [NSString stringWithFormat:@"<Person:記憶體地址:%p name = %@ age = %ld>",self,self.name,self.age]; return string; } 22.objc使用什麼機制管理物件記憶體? 使用記憶體管理計數器,來管理記憶體的。當記憶體管理計數器為0的時候,物件就會被釋放。 中級 Block 1.block的實質是什麼?一共有幾種block?都是什麼情況下生成的? block:儲存位置,可能分為3個地方:程式碼去,堆區、棧區(ARC情況下會自動拷貝到堆區,因此ARC下只能有兩個地方:程式碼去、堆區) 程式碼區:不訪問棧區的變數(如區域性變數),且不訪問堆區的變數(alloc建立的物件),此時block存放在程式碼去。 堆區:訪問了處於棧區的變數,或者堆區的變數,此時block存放在堆區。–需要注意實際是放在棧區,在ARC情況下會自動拷貝到堆區,如果不是ARC則存放在棧區,所在函式執行完畢就回釋放,想再外面呼叫需要用copy指向它,這樣就拷貝到了堆區,strong屬性不會拷貝、會造成野指標錯區。 2.為什麼在預設情況下無法修改被block捕獲的變數? __block都做了什麼? 預設情況下,block裡面的變數,拷貝進去的是變數的值,而不是指向變數的記憶體的指標。 當使用__block修飾後的變數,拷貝到block裡面的就是指向變數的指標,所以我們就可以修改變數的值。 3.模擬一下迴圈引用的一個情況?block實現介面反向傳值如何實現? Person *p = [[Person alloc]init];[p setPersonBlock:^(NSString *str) { p.name = str;}]; Runtime 1.objc在向一個物件傳送訊息時,發生了什麼? 根據物件的isa指標找到類物件id,在查詢類物件裡面的methodLists方法函式列表,如果沒有在好到,在沿著superClass,尋找父類,再在父類methodLists方法列表裡面查詢,最終找到SEL,根據idSEL確認IMP(指標函式),在傳送訊息; 3.什麼時候會報unrecognized selector錯誤?iOS有哪些機制來避免走到這一步? 當傳送訊息的時候,我們會根據類裡面的methodLists列表去查詢我們要動用的SEL,當查詢不到的時候,我們會一直沿著父類查詢,當最終查詢不到的時候我們會報unrecognized selector錯誤 當系統查詢不到方法的時候,會呼叫+(BOOL)resolveInstanceMethod:(SEL)sel動態解釋的方法來給我一次機會來新增,呼叫不到的方法。或者我們可以再次使用-(id)forwardingTargetForSelector:(SEL)aSelector重定向的方法來告訴系統,該呼叫什麼方法,一來保證不會崩潰。 4.能否向編譯後得到的類中增加例項變數?能否向執行時建立的類中新增例項變數?為什麼? 1.不能向編譯後得到的類增加例項變數 2.能向執行時建立的類中新增例項變數 解釋: 1.編譯後的類已經註冊在runtime中,類結構體中的objc_ivar_list例項變數的連結串列和instance_size例項變數的記憶體大小已經確定,runtime會呼叫class_setvarlayout或class_setWeaklvarLayout來處理strong weak引用.所以不能向存在的類中新增例項變數 2.執行時建立的類是可以新增例項變數,呼叫class_addIvar函式.但是的在呼叫objc_allocateClassPair之後,objc_registerClassPair之前,原因同上. 5.runtime如何實現weak變數的自動置nil? runtime 對註冊的類, 會進行佈局,對於 weak 物件會放入一個 hash 表中。 用 weak 指向的物件記憶體地址作為 key,當此物件的引用計數為0的時候會 dealloc,假如 weak 指向的物件記憶體地址是a,那麼就會以a為鍵, 在這個 weak 表中搜索,找到所有以a為鍵的 weak 物件,從而設定為 nil。 6.給類新增一個屬性後,在類結構體裡哪些元素會發生變化? instance_size :例項的記憶體大小 objc_ivar_list *ivars:屬性列表 RunLoop 1.runloop是來做什麼的?runloop和執行緒有什麼關係?主執行緒預設開啟了runloop麼?子執行緒呢? runloop:字面意思就是跑圈,其實也就是一個迴圈跑圈,用來處理執行緒裡面的事件和訊息。 runloop和執行緒的關係:每個執行緒如果想繼續執行,不被釋放,就必須有一個runloop來不停的跑圈,以來處理執行緒裡面的各個事件和訊息。 主執行緒預設是開啟一個runloop。也就是這個runloop才能保證我們程式正常的執行。子執行緒是預設沒有開始runloop的 2.runloop的mode是用來做什麼的?有幾種mode? model:是runloop裡面的模式,不同的模式下的runloop處理的事件和訊息有一定的差別。 系統預設註冊了5個Mode: (1)kCFRunLoopDefaultMode: App的預設 Mode,通常主執行緒是在這個 Mode 下執行的。 (2)UITrackingRunLoopMode: 介面跟蹤 Mode,用於 ScrollView 追蹤觸控滑動,保證介面滑動時不受其他 Mode 影響。 (3)UIInitializationRunLoopMode: 在剛啟動 App 時第進入的第一個 Mode,啟動完成後就不再使用。 (4)GSEventReceiveRunLoopMode: 接受系統事件的內部 Mode,通常用不到。 (5)kCFRunLoopCommonModes: 這是一個佔位的 Mode,沒有實際作用。 注意iOS 對以上5中model進行了封裝 NSDefaultRunLoopMode; NSRunLoopCommonModes 3.為什麼把NSTimer物件以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)新增到主執行迴圈以後,滑動scrollview的時候NSTimer卻不動了? nstime物件是在 NSDefaultRunLoopMode下面呼叫訊息的,但是當我們滑動scrollview的時候,NSDefaultRunLoopMode模式就自動切換到UITrackingRunLoopMode模式下面,卻不可以繼續響應nstime傳送的訊息。所以如果想在滑動scrollview的情況下面還呼叫nstime的訊息,我們可以把nsrunloop的模式更改為NSRunLoopCommonModes 4.蘋果是如何實現Autorelease Pool的? Autorelease Pool作用:快取池,可以避免我們經常寫relase的一種方式。其實就是延遲release,將建立的物件,新增到最近的autoreleasePool中,等到autoreleasePool作用域結束的時候,會將裡面所有的物件的引用計數器-1. 類結構 1.isa指標?(物件的isa,類物件的isa,元類的isa都要說) 在oc中,類也是物件,所屬元類。所以經常說:萬物皆物件 物件的isa指標指向所屬的類 類的isa指標指向了所屬的元類 元類的isa指向了根元類,根元類指向了自己。 AC17D0A0-CB2A-4C23-8430-4BC7A99571CE.png 2.類方法和例項方法有什麼區別? 呼叫的方式不同,類方法必須使用類呼叫,在方法裡面不能呼叫屬性,類方法裡面也必須呼叫類方法。儲存在元類結構體裡面的methodLists裡面 例項方法必須使用例項物件呼叫,可以在例項方法裡面使用屬性,例項方法也必須呼叫例項方法。儲存在類結構體裡面的methodLists裡面 3.介紹一下分類,能用分類做什麼?內部是如何實現的?它為什麼會覆蓋掉原來的方法? category:我們可以給類或者系統類新增例項方法方法。我們新增的例項方法,會被動態的新增到類結構裡面的methodList列表裡面。categort 4.執行時能增加成員變數麼?能增加屬性麼?如果能,如何增加?如果不能,為什麼? 可以新增屬性的,但必須我們實現它的gettersetter方法。但是沒有新增帶下滑線同名的成員變數 但是我們使用runtime我們就可以實現新增成員變數方法如下 - (void)setName:(NSString *)name {/** * 為某個類關聯某個物件 * * @param object#> 要關聯的物件 description#> * @param key#> 要關聯的屬性key description#> * @param value#> 你要關聯的屬性 description#> * @param policy#> 新增的成員變數的修飾符 description#> */ objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);}- (NSString *)name {/** * 獲取到某個類的某個關聯物件 * * @param object#> 關聯的物件 description#> * @param key#> 屬性的key值 description#> */return objc_getAssociatedObject(self, @selector(name));} 5.objc中向一個nil物件傳送訊息將會發生什麼?(返回值是物件,是標量,結構體) • 如果一個方法返回值是一個物件,那麼傳送給nil的訊息將返回0(nil)。例如:Person motherInlaw = [ aPerson spouse] mother]; 如果spouse物件為nil,那麼傳送給nil的訊息mother也將返回nil。 • 如果方法返回值為指標型別,其指標大小為小於或者等於sizeof(void),float,double,long double 或者long long的整型標量,傳送給nil的訊息將返回0。 • 如果方法返回值為結構體,正如在《Mac OS X ABI 函式呼叫指南》,傳送給nil的訊息將返回0。結構體中各個欄位的值將都是0。其他的結構體資料型別將不是用0填充的。 • 如果方法的返回值不是上述提到的幾種情況,那麼傳送給nil的訊息的返回值將是未定義的。 詳細解答 高階 1.UITableview的優化方法(快取高度,非同步繪製,減少層級,hide,避免離屏渲染) 快取高度:當我們建立frame模型的時候,計算出來cell的高度的時候,我們可以將cell的高度快取到字典裡面,以cell的indexpathIdentifier作為為key。 NSString *key = [[HeightCache shareHeightCache] makeKeyWithIdentifier:@"YwywProductGradeCell" indexPath:indexPath];if ([[HeightCache shareHeightCache] existInCacheByKey:key]) { return [[HeightCache shareHeightCache] heightFromCacheWithKey:key];}else{ YwywProductGradeModelFrame *modelFrame = self.gradeArray[indexPath.row]; [[HeightCache shareHeightCache] cacheHieght:modelFrame.cellHight key:key]; return modelFrame.cellHight;} 非同步繪製、減少層級:目前還不是很清楚 hide:個人理解應該是hidden吧,把可能會用到的控制元件都創建出來,根據不同的情況去隱藏或者顯示出來。 避免離屏渲染:只要不是同時使用邊框/邊框顏色以及圓角的時候,都可以使用layer直接設定。不會造成離屏渲染。 2.有沒有用過執行時,用它都能做什麼?(交換方法,建立類,給新建立的類增加方法,改變isa指標) 交換方式:一般寫在類的+(void)load方法裡面 /** 獲取原始setBackgroundColor方法 */Method originalM = class_getInstanceMethod([self class], @selector(setBackgroundColor:));/** 獲取自定義的pb_setBackgroundColor方法 */Method exchangeM = class_getInstanceMethod([self class], @selector(pb_setBackgroundColor:));/** 交換方法 */method_exchangeImplementations(originalM, exchangeM); 建立類: Class MyClass = objc_allocateClassPair([NSObject class], "Person", 0); 新增方法 /**引數一、類名引數 二、SEL 新增的方法名字引數 三、IMP指標 (IMP就是Implementation的縮寫,它是指向一個方法實現的指標,每一個方法都有一個對應的IMP) 引數四、其中types引數為"[email protected]:@“,按順序分別表示:具體型別可參照[官方文件](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html)i 返回值型別int,若是v則表示[email protected] 引數id(self): SEL(_cmd)@ id(str) [email protected]:表示返回值是void 帶有SEL引數 (An object (whether statically typed or typed id)) */class_addMethod(Person, @selector(addMethodForMyClass:), (IMP)addMethodForMyClass, "[email protected]:"); 新增例項變數 /**引數一、類名引數 二、屬性名稱引數 三、開闢位元組長度引數 四、對其方式引數 五、引數型別 “@” 官方解釋 An object (whether statically typed or typed id) (物件 靜態型別或者id型別) 具體型別可參照[官方文件](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html)return: BOOL 是否新增成功 */BOOL isSuccess = class_addIvar(Person, "name", sizeof(NSString *), 0, "@");isSuccess?NSLog(@"新增變數成功"):NSLog(@"新增變數失敗"); 3.看過哪些第三方框架的原始碼?都是如何實現的?(如果沒有,問一下多圖下載的設計) 4.SDWebImage的快取策略? sd載入一張圖片的時候,會先在記憶體裡面查詢是否有這張圖片,如果沒有會根據圖片的md5(url)後的名稱去沙盒裡面去尋找,是否有這張圖片,如果沒有會開闢執行緒去下載,下載完畢後加載到imageview上面,並md(url)為名稱快取到沙盒裡面。 5.AFN為什麼新增一條常駐執行緒? AFN 目的:就是開闢執行緒請求網路資料。如果沒有常住執行緒的話,就會每次請求網路就去開闢執行緒,完成之後銷燬開闢執行緒,這樣就造成資源的浪費,開闢一條常住執行緒,就可以避免這種浪費,我們可以在每次的網路請求都新增到這條執行緒。 6.KVO的使用?實現原理?(為什麼要建立子類來實現) kvo:鍵值觀察,根據鍵對應的值的變化,來呼叫方法。 註冊觀察者:addObserver:forKeyPath:options:context: 實現觀察者:observeValueForKeyPath:ofObject:change:context: 移除觀察者:removeObserver:forKeyPath:(物件銷燬,必須移除觀察者) 注意 使用kvo監聽A物件的時候,監聽的本質不是這個A物件,而是系統建立的一箇中間物件NSKVONotifying_A並繼承A物件,並且A物件的isa指標指向的也不是A的類,而是這個NSKVONotifying_A物件 kvo詳解 7.KVC的使用?實現原理?(KVC拿到key以後,是如何賦值的?知不知道集合操作符,能不能訪問私有屬性,能不能直接訪問_ivar) kvc:鍵值賦值,使用最多的即使字典轉模型。利用runtime獲取物件的所有成員變數, 在根據kvc鍵值賦值,進行字典轉模型 setValue: forKey: 只查詢本類裡面的屬性 setValue: forKeyPath:會查詢本類裡面屬性,沒有會繼續查詢父類裡面屬性。 kvc詳解

相關推薦

iOS 技術總結筆記

1.為什麼說Objective-C是一門動態的語言? 1.object-c類的型別和資料變數的型別都是在執行是確定的,而不是在編譯時確定。例如:多型特性,我們可以使用父類物件來指向子類物件,並且可以用來呼叫子類的方法。執行時(runtime)特性,我們可以動態的新增方法,

第一階段項目技術總結(ES6技術,vue技術

每次 then 觸發 ext eba 拆分 點擊 log 是否 多思多想,勤勞! 1. 擴展運算符‘...‘,主要操作用於數組的展開運算,一般簡單的用於數組的合並,數組每個元素的拆分 2.const routers = require.context ( ‘ 要操作的目

react高階技術總結

Mixin mixin允許我們定義可以再多個元件中共用的方法,它們就是混合近元件中的物件而已,React的Mixin  能夠防止靜默函式覆蓋,同時支援多個Mixin混合 React.createClass({ mixins : [{ getInitial

XX公寓管理系統技術總結

最近三天做了XX公寓管理系統,採用JSP+Servlet+Oracle的設計方式,資料庫連線池採用c3p0,總體架構為三層設計模式,利用過濾器做了登陸驗證和設定頁面的字元編碼。以上為當前小專案採用的技術,現在還沒有做完,只是做了管理員的使用者管理模組和角色管理兩個模組,現在針對這兩個模組來總結下

Muduo 網路庫原始碼分析 之 關鍵技術總結

最近又把muduo網路庫仔細研究了一遍,收穫良多。本文將對muduo中的設計思想以及關鍵的技術細節進行總結和分析,當然由於篇幅的原因這裡更多的是對關鍵技術的簡略提及,具體細節還需要讀者自己去查詢學習資料。 muduo/base Date類 日期類的封裝,

自動化-Selenium WebDriver相關技術總結

前端工具:FireBug&FirePath setuptools是Python Enterprise Application Kit (PEAK)的一個副專案,它是Python的distutilsde工具的增強工具,可以讓程式設計師更方便的建立和釋出P

Android 配置子Module混淆時遇到的錯誤,和一些零散技術總結

概要說明: 1、子Module不能配置混淆,僅僅只能在主Module中配置混淆。 2、主Module配置了混淆,打包成apk後,其他Module的程式碼也會一起混淆。 3、所有Module中的res目錄下的資源都會在打包時合併到主Module的res目錄下對應檔案位置。 4

vue項目總結,所用到的技術

-- ews -1 數量 頁面 splice 匹配規則 {} 路由 1.用到的技術點 vue 是一個漸進式JavaScript框架 npm install vue vue-route 是一個路由匹配功能 npm install vue-route

Atitit 面試技術最小化問題法總結 目錄 1. Web 前端 1 1.1. Jq 常用操作哪些?? 1 1.2. 查詢後如何繫結後端資料到表格 2 1.3. 提交後怎麼接受表單資料 2 2.

Atitit 面試技術點最小化問題法總結     目錄 1. Web 前端 1 1.1. Jq 常用操作哪些?? 1 1.2. 查詢後如何繫結後端資料到表格 2 1.3. 提交後怎麼接受表單資料 2 2. Mvc Springmvc 2 2.1

《實時碰撞檢測演算法技術》讀書筆記(六):最近計算(下)

點至3D矩形的最近點 實際上等同於計算OBB上的最近點,其中3D矩形可看做是z向為0的OBB。 struct Rect { Point c; Vector u[2]; float e[2]; } 令z軸為0並重寫函式ClosestPtPointO

計算機二級Java筆記/重難點易錯總結(按章節歸納整理)

一、java的體系結構: 1、Java程式首先由編譯器轉換為標準位元組程式碼,然後由虛擬機器來解釋執行      Applet是java的一類特殊應用程式,它潛入HTML中,可以實現多媒體的使用者介面或複雜的計算,可以在瀏覽器上執行; 2、JDK的bin目錄下由編譯器、

ios SDK開發之關於CoreAnimation的一些注意總結

   關於UIView animation,很多讀者相信非常喜歡用animation block的動畫API,如下: Animating Views with Blocks   + animateWithDuration:delay:options:animatio

關於JAXP技術的幾總結

本文只是個人總結,不是結論,因此不保證文章內容的正確性,僅是自己學習過程中的一些個人理解而已... JAXP簡介 JAXP全稱Java API for XML Processing,最開始的時候(JAXP1.0)是叫Java API for XML Parsing,因為那個

詳細解剖大型H5單頁面應用的核心技術

事件機制 設置 橫豎 模板 phone inline lib 優點 溢出 闡述下項目 Xut.js 開發中一個比較核心的優化技術點,這是一套平臺代碼,並非某一個插件功能或者框架可以直接拿來使用,核心代碼大概是6萬行左右(不包含任何插件) 。這也並非一個開源項目,不能

十二、十三天總結筆記

異常、io、file一:File 1.1 File:文件和目錄(文件夾)路徑名的抽象表示形式。 1.2 File的構造方法: File(String pathname):把一個路徑名稱封裝成File對象 File(String p

OO易錯總結

space tor 初始化列表 audio 子類 book white hit 類的初始化 在寫子類的構造函數時,要在初始化列表中指定使用的父類的構造函數並完成其初始化,如下例: p,li { white-space: pre-wrap } AudioBook(co

Git總結筆記1-搭建和使用30條簡明筆記

工作區 本地倉庫 模式 ins git windows 歷史 總結 log 1.環境搭建: Linux:安裝git安裝包(yum install -y git) Windows:到官網下載安裝包 安裝完成後配置如下用戶名和郵箱: git config --global us

Git總結筆記4-git push origin master 報錯的解決方法

failed 總結筆記 rebase nbsp read hint err ont version 1 錯誤提示如下: 2 [[email protected]/* */ php]# git push -u origin master 3 To [ema

Git總結筆記3-把本地倉庫推送到github

-c don gin 目的 commit 筆記 pre git from 說明:此筆記在centos 7 上完成 1.配置公鑰 [[email protected]/* */ ~]# ssh-keygen -t rsa -C "[email 

IOS 照片瀏覽器總結(思想步驟)

con bsp rop 設置 分析 瀏覽器 圖像 atom return 1. 界面分析========================================1> 需要讀取或修改屬性的控件需要設置屬性// 序號標簽// 圖片// 圖片描述// 左邊按鈕//