Objective-C基礎知識點總結
長文,建議跳躍選擇性閱讀,大約10min可以讀完全文。
iOS開發
1.目錄
1.個人學習建議
2.知識點整理
3.下集預告
iOS這一行,都過了這麼多年,還是水分很足,沒有幾個願意安安心心查資料寫東西的。雖說博客都是互相抄,但是起碼其他行業抄的最開始的人是對的,但是這一行因為中文資料少(是的,到現在中文資料也不完善),所以出現很多粗製濫造的,這裡經過筆者校驗之後分享一些相關知識。
個人建議:
入門視頻首選是斯坦福的CS193P教程 - Youtube,白鬍子老爺爺在這一行可以稱得上是元老,之前還想出一個針對這個視頻教程的學習筆記,後來給鴿了;這裡鏈接放了YouTube上的最新視頻,牆內的朋友也可以自行百度其他資源,我這裡也存了一份百度雲,需要的可以在評論留下郵箱(某資源論壇既視感???)。
項目實戰,大學生的話去實驗室找一個項目做一做,大概幾個月也就熟了(最初級的那種),這裡還要感謝當初帶我的學長@子豪學長——是一個很讓人佩服的學長。社會人士自學的話可以在在github、碼雲上面多找找完整的客戶端試試看。
2.重要知識點總結
其實下面的每一個點都可以單獨行文,這裡摘錄其中較為重要的部分,同時添加鏈接供讀者深度查看。之後可能單獨領出深究,這裡先埋坑。
2.1 繼承關係
OC中的繼承屬於單繼承,這一點和Java類似。
在Objective-C中super是指向直接父類的指針
而self是指向本身的指針,self就相當於java中的this指針。
在Objectiv-C中幾乎所有的類都是繼承自NSObject類,NSObject類中存在大量功能強大的方法。這裡不再贅述,詳情可查看
Objective-C中的繼承和多態
2.2 MVC設計模式
MVC
iOS開發——MVC詳解&Swift+OC
2.3 block
這裡搬運一下
block定義
有人認為OC中block 本質應該是一個函數指針加上一個對應捕獲上下文變數的內存塊(結構體或者類)。 建議參考: 知乎:OC中, block(塊)的本質是什麼?
2.4 靜態變數(static)、全局變數
這裡只需要看幾篇博客,不再搬運。
1.OC中的全局變數 與 static [2.OC中的static靜態變數/extern全局變數/內存分區說明]
這裡安利自己的下一篇文章: http://www.jianshu.com/p/e83f983ded01
2.5 Id, instancetype
id數據類型,是一種通用的對象類型。也就是說,它可以用來存儲屬於任何類的對象。當以這種方式在一個變數中存儲不同類型的對象時,在程序執行的期間,這種數據類型的真正優勢就出現了。
2.6 Copy, strong, retain
先說copy和strong的區別,這裡摘錄一個例子。
在定義一個類的property時候,為property選擇strong還是copy特別注意和研究明白的,如果property是NSString或者NSArray及其子類的時候,最好選擇使用copy屬性修飾。
為什麼呢?這是為了防止賦值給它的是可變的數據,如果可變的數據發生了變化,那麼該property也會發生變化。
代碼示例
還是結合代碼來說明這個情況
@interface Person : NSObject @property (strong, nonatomic) NSArray *bookArray1; @property (copy, nonatomic) NSArray *bookArray2; @end @implementation Person //省略setter方法 @end //Person調用 main(){ NSMutableArray *books = [@[@"book1"] mutableCopy]; Person *person = [[Person alloc] init]; person.bookArray1 = books; person.bookArray2 = books; [books addObject:@"book2"]; NSLog(@"bookArray1:%@",person.bookArray1); NSLog(@"bookArray2:%@",person.bookArray2); }
我們看到,使用strong修飾的person.bookArray1輸出是[book1,book2],而使用copy修飾的person.bookArray2輸出是[book1]。這下可以看出來區別了吧。
備註:使用strong,則person.bookArray1與可變數組books 指向同一塊內存區域 ,books內容改變,導致person.bookArray1的內容改變,因為兩者是同一個東西;而使用copy,person.bookArray2在賦值之前,將books內容複製,創建一個 新的內存區域,所以兩者不是一回事,books的改變不會導致person.bookArray2的改變。
Objective-C屬性修飾符strong和copy的區別
2.7 Manually reference Counting和Automatic Reference Counting
1.MRC 手動管理內存(Manual Reference Counting)
int main(int argc, const char * argv[]) { @autoreleasepool { // 只要創建一個對象默認引用計數器的值就是1 Person *p = [[Person alloc] init]; NSLog(@"retainCount = %lu", [p retainCount]); // 1 // 只要給對象發送一個retain消息, 對象的引用計數器就會+1 [p retain]; NSLog(@"retainCount = %lu", [p retainCount]); // 2 // 通過指針變數p,給p指向的對象發送一條release消息 // 只要對象接收到release消息, 引用計數器就會-1 // 只要一個對象的引用計數器為0, 系統就會釋放對象 [p release]; // 需要注意的是: release並不代表銷毀回收對象, 僅僅是計數器-1 NSLog(@"retainCount = %lu", [p retainCount]); // 1 [p release]; // 0 NSLog(@"--------"); } // [p setAge:20]; // 此時對象已經被釋放 return 0; }
2.自動釋放池(Automatic Reference Counting) autorelease是一種支持引用計數的內存管理方式,只要給對象發送一條autorelease消息,會將對象放到一個自動釋放池中,當自動釋放池被銷毀時,會對池子裡面的所有對象做一次release操作
使用autorelease有什麼好處呢
不用再關心對象釋放的時間 不用再關心什麼時候調用release
autorelease的原理實質上是什麼?
autorelease實際上只是把對release的調用延遲了,對於每一個autorelease,系統只是把該對象放入了當前的autorelease pool中,當該pool被釋放時,該pool中的所有對象會被調用release。
OC知識--徹底理解內存管理(MRC、ARC)
2.8 auto、const和volatile
待補充...
2.9 alloc, init, dealloc, release,new ,retain
簡單地說,alloc分配內存空間,init對該對象進行初始化,這些方法若沒有重寫方法則默認繼承自父類。 通常來講,new = alloc + init Objective-C的對象在使用完成之後不會自動銷毀,需要執行dealloc來釋放空間(銷毀),否則內存泄露。下面是一個簡單的例子。
ClassA *obj1 = [[ClassA alloc] init]; [obj1 hello]; //輸出hello [obj1 dealloc];
Objective-C採用了引用計數(ref count或者retain count)。對象的內部保存一個數字,表示被引用的次數。例如,某個對象被兩個指針所指向(引用)那麼它的retain count為2。需要銷毀對象的時候,不直接調用dealloc,而是調用release。release會讓retain count減1,只有retain count等於0,系統才會調用dealloc真正銷毀這個對象。
Objective-C指針賦值時,retain count不會自動增加,需要手動retain。
ClassA *obj1 = [[ClassA alloc] init]; //retain count = 1 ClassA *obj2 = obj1; //retain count = 1 [obj2 retain]; //retain count = 2 [obj1 hello]; //輸出hello [obj1 release]; //retain count = 2 – 1 = 1 [obj2 hello]; //輸出hello [obj2 release]; //retain count = 0,對象被銷毀
alloc & init
Objective-C 內存管理——你需要知道的一切
Objective-C內存管理教程和原理剖析(一)
2.10 文件操作
2.11 分類和協議
2.12 NSString, NSNumber,NSArray,NSDictionary, NSSet 類的主要方法
2.13 Cocoa
Cocoa是一種支持應用程序提供豐富用戶體驗的框架,它實際上由兩個框架組成:
Foundation框架
Application Kit (或AppKit)框架 : 提供與窗口、按鈕、列表等相關的類。
Cocoa框架服務
補充:
內核以設備驅動程序的形式提供與硬體的底層通信。它負責管理系統資源,包括調度要執行的程序、管理內存和電源,以及執行基本的I/O操作。
核心服務提供的支持比它上面層次更加底層或更加「核心」。例如,這裡提供對集合、網路、 調試、文件管理、文件夾、內存管理、線程、時間和電源的管理。 應用程序服務層包含對列印和圖形呈現的支持,包括Quartz、OpenGL和Quicktime。
Cocoa層直接位於應用程序層之下。正如圖所示,Cocoa包括Foundation禾口AppKit框架0 Foundation框架提供的類用於處理集合、字元串、內存管理、文件系統『存檔等。AppKit框架提供的類用於管理視圖、窗口、文檔和讓Mac OS X聞名於世的多信息用戶界面。
Cocoa框架用於Mac OS X桌面與筆記本電腦的應用程序開發,而Cocoa Touch框架用於 iPhone與ipod Touch的應用程序開發。 Cocoa和Cocoa Touch都有Foundation框架。然而在Cocoa Touch下,UIKit代替了 AppKit框架,以便為很多相同類型的對象提供支持,比如窗口、視圖、按鈕、文本域等。另外,Cocoa Touch還提供使用加速器(它與GPS和WiFi信號一樣都能跟綜你的位置)的類和觸摸式界面, 並且去掉了不需要的類,比如支持列印的類。
4.
歡迎指正批評與交流,本博客將長期更新維護,如果讀完覺得有一定幫助可以點一個喜歡支持一下
※目前最牛手機「一加5」開箱
※2016/17 「巴黎大都會」高級手工坊系列
※好心塞:你日常美容方式,大錯特錯!你中幾槍?
※懶人新助手,窗寶w850試用心得
※跨界玩轉食尚之旅
TAG:輕芒 |
※python:web框架Falsk知識點總結
※Chapter 4 TensorFlow基礎知識
※python爬蟲知識點2-selenium的基礎知識點
※OpenStack關鍵技術系列:Libvirt基礎知識
※Fantastic Reading 知識的目的
※什麼是知識共享(Creative Commons)?
※什麼是知識共享Creative Commons?
※python基礎知識
※Python的Socket知識2:粘包處理
※OpenStack關鍵技術系列:最全OpenStack知識科普
※Python的Socket知識1:入門
※Book 4 Module 2 知識點清單
※漲知識!Dolby Vision和Dolby Atmos有何不同?文末有驚喜
※WolframAlpha-未來的語義知識引擎
※Android系統小知識
※Switch小知識分享
※法餐烹飪小知識——Oignon br?lé
※HTTP Header小知識
※能源教育!Renewables Academy AG (RENAC)慶祝10年來成功地在世界各地傳播可再生能源和能源效率知識
※知識貼:Keep the change「零頭不用找了」還是t