iOS 知識點總結

hey同學發表於2018-04-27

屬性關鍵字 readwrite,readonly,assign,retain,copy,nonatomic 各是什麼作用,在那種情況下用?

1. readwrite 是可讀可寫特性。需要生成getter方法和setter方法。
2. readonly 是隻讀特性。只會生成getter方法,不會生成setter方法,不希望屬性在類外改變。
3. assign 是賦值特性。setter方法將傳入引數賦值給例項變數;僅設定變數時,assign用於基本資料型別。
4. retain(MRC)/strong(ARC) 表示持有特性。setter方法將傳入引數先保留,再賦值,傳入引數的retaincount會+1。
5. copy 表示拷貝特性。setter方法將傳入物件複製一份,需要完全一份新的變數時。
6. nonatomic 非原子操作。不寫的話預設就是atomic。atomic 和 nonatomic     的區別在於,系統自動生成的 getter/setter 方法不一樣。對於atomic的屬性,系統生成的 getter/setter 會保證 get、set 操作的完整性,而nonatomic就沒有這個保證了。所以,nonatomic的速度要比atomic快。
複製程式碼

不過atomic可並不能保證執行緒安全。

OC中的一個完整的類包括哪兩部分

OC中的類必須包括兩部分,interface部分和implementation部分。OC中將成員變數和成員方法的宣告部分放置在interface部分中,包括繼承關係,protocal實現關係,都在interface裡面的頭部進行宣告,
然後將實現部分放置在implementation部分中,相當於是將類拆分成宣告和實現兩部分。
複製程式碼

屬性的setter和getter方法

setter是給外部提供一個修改內部屬性值的介面,通過給物件指標傳送該訊息(呼叫setter方法)可以做到修改內部屬性值。

getter 方法是外界提供一個檢視內部變數的的介面 。
複製程式碼

copy與mutableCopy

深拷貝:
物件拷貝 - 重新申請一片記憶體保留這個物件,與原物件之間沒有半點關係。
複製程式碼
淺拷貝:
指標拷貝 - 實際上相當於引用計數+1,被拷貝的和拷貝的引用同一個物件。
複製程式碼
1.對非集合類物件的copy操作,以NSString為例
對不可變物件進行 copy 操作是指標拷貝,mutableCopy 操作時物件拷貝。
對可變物件進行 copy 和 mutableCopy 都是物件拷貝,記憶體地址不變。
複製程式碼
2.對集合類物件的copy操作
對不可變物件做copy是指標拷貝,做mutableCopy是不完全深拷貝。
對可變物件做copy或mutableCopy都是不完全深拷貝。
複製程式碼

不完全深拷貝(也有人說是單層深拷貝 )------ 即雖然新開闢了記憶體地址,但是存放在記憶體上的值(也就是陣列裡的元素仍然指向原陣列元素值,並沒有另外複製一份)。 並且如果打個斷點可以發現對任何物件做copy操作返回的是一個不可變的物件,對任何物件做mutableCopy返回的是一個可變的物件

frame 和 bounds 有什麼不同?

frame指的是:該view在父view座標系統中的位置和大小。(參照點是父view的座標系統)
bounds指的是:該view在本身座標系統中的位置和大小。(參照點是本身座標系統)
複製程式碼

Objective-C的類可以多重繼承麼?可以實現多個介面麼?Category是什麼?重寫一個類的方法用繼承好還是分類好?為什麼

Objective-C的類不可以多重繼承;可以實現多個介面(協議);Category是類別;一般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關係
複製程式碼

什麼情況使用 weak 關鍵字,相比 assign 有什麼不同

1.在 ARC 中,在有可能出現迴圈引用的時候,往往要通過讓其中一端使用 weak 來解決,比如: delegate 代理屬性。
2.自身已經對它進行一次強引用,沒有必要再強引用一次,此時也會使用 weak,自定義 IBOutlet 控制元件屬性一般也使用 weak;當然,也可以使用strong。

IBOutlet連出來的檢視屬性為什麼可以被設定成weak?
因為父控制元件的subViews陣列已經對它有一個強引用。

不同點:
assign 可以用非 OC 物件,而 weak 必須用於 OC 物件。
weak 表明該屬性定義了一種“非擁有關係”。在屬性所指的物件銷燬時,屬性值會自動清空(nil)。
複製程式碼

Objective-C 記憶體管理

Objective-C的記憶體管理主要有三種方式ARC(自動記憶體計數)、手動記憶體計數、記憶體池。
1. 自動記憶體計數ARC:由Xcode自動在App編譯階段,在程式碼中新增記憶體管理程式碼。
2. 手動記憶體計數MRC:遵循記憶體誰申請、誰釋放;誰新增,誰釋放的原則。
3. 記憶體釋放池Release Pool:把需要釋放的記憶體統一放在一個池子中,當池子被抽乾後(drain),池子中所有的記憶體空間
也被自動釋放掉。記憶體池的釋放操作分為自動和手動。自動釋放受runloop機制影響。
複製程式碼

Category(類別)、 Extension(擴充套件)和繼承的區別

1. 分類有名字,類擴充套件沒有分類名字,是一種特殊的分類。
2. 分類只能擴充套件方法(屬性僅僅是宣告,並沒真正實現),類擴充套件可以擴充套件屬性、成員變數和方法。
3. 繼承可以增加,修改或者刪除方法,並且可以增加屬性。
複製程式碼

ViewController生命週期

1. initWithCoder:通過nib檔案初始化時觸發。
2. awakeFromNib:nib檔案被載入的時候,會發生一個awakeFromNib的訊息到nib檔案中的每個物件。
3. loadView:開始載入檢視控制器自帶的view。
4. viewDidLoad:檢視控制器的view被載入完成。
5. viewWillAppear:檢視控制器的view將要顯示在window上。
6. updateViewConstraints:檢視控制器的view開始更新AutoLayout約束。
7. viewWillLayoutSubviews:檢視控制器的view將要更新內容檢視的位置。
8. viewDidLayoutSubviews:檢視控制器的view已經更新檢視的位置。
9. viewDidAppear:檢視控制器的view已經展示到window上。
10. viewWillDisappear:檢視控制器的view將要從window上消失。
11. viewDidDisappear:檢視控制器的view已經從window上消失。
複製程式碼

kvo和kvc

kvc
通過鍵值路徑為物件的屬性賦值。主要是可以為私有的屬性賦值 setValue:ForKey:
通過鍵值路徑獲取屬性的值。主要是可以通過key獲得私有屬性的值 valueforKey:
複製程式碼
kvo
KVO提供了一種觀察者的機制,通過對某個物件的某個屬性新增觀察者,當該屬性改變,就會呼叫"observeValueForKeyPath:"方法,為我們提供一個“物件值改變了!”的時機進行一些操作。
複製程式碼
什麼是 RunLoop unloop是來做什麼的?runloop和執行緒有什麼關係?主執行緒預設開啟了runloop麼?子執行緒呢?
runloop: 從字面意思看:執行迴圈、跑圈,其實它內部就是do-while迴圈,在這個迴圈內部不斷地處理各種任務
(比如Source、Timer、Observer)事件。runloop和執行緒的關係:一個執行緒對應一個RunLoop,主執行緒的RunLoop預設建立並啟動,子執行緒的RunLoop需手動建立且手動啟動(呼叫run方法)。RunLoop
只能選擇一個Mode啟動,如果當前Mode中沒有任何Source(Sources0、Sources1)、Timer,
那麼就直接退出RunLoop。
複製程式碼
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
複製程式碼
SDWebImage裡面給UIImageView載入圖片的邏輯
SDWebImage 中為 UIImageView 提供了一個分類UIImageView+WebCache.h, 這個分類中有一個最常用的介面
sd_setImageWithURL:placeholderImage:,會在真實圖片出現前會先顯示佔點陣圖片,當真實圖片被載入出來後
再替換佔點陣圖片。

載入圖片的過程大致如下:
1.首先會在 SDWebImageCache 中尋找圖片是否有對應的快取, 它會以url 作為資料的索引先在記憶體中尋找是否有
對應的快取
2.如果快取未找到就會利用通過MD5處理過的key來繼續在磁碟中查詢對應的資料, 如果找到了, 就會把磁碟中的資料
載入到記憶體中,並將圖片顯示出來
3.如果在記憶體和磁碟快取中都沒有找到,就會向遠端伺服器傳送請求,開始下載圖片
4.下載後的圖片會加入快取中,並寫入磁碟中
5.整個獲取圖片的過程都是在子執行緒中執行,獲取到圖片後回到主執行緒將圖片顯示出來

SDWebImage原理:
呼叫類別的方法:
1. 從記憶體(字典)中找圖片(當這個圖片在本次使用程式的過程中已經被載入過),找到直接使用。
2. 從沙盒中找(當這個圖片在之前使用程式的過程中被載入過),找到使用,快取到記憶體中。
3. 從網路上獲取,使用,快取到記憶體,快取到沙盒。
複製程式碼

相關文章