這篇只是用于記憶知識點
interface 接口
編程
基礎知識類
在編程語言中,靈活與安全的問題總是沖突.過度的靈活會導致使用者經常使用到一些十分關鍵的位置,這使得它是開放的,易于修改的,同時這些關鍵,重要的的區域會處于危險的位置.
安全性的編程語言他們會制定許多協議,規范,告訴一些程序需要通過規范編寫,這讓程序犯錯的幾率變小,同時也讓語言的靈活性大大降低.
.h 文件寫方法的聲明. 可以被子類調用(可以在對象范圍之外調用) .m 文件 寫方法的實現. 聲明寫在.m文件里,不可以在子類中調用.(不可以在對象范圍之外調用)
.h 文件中的聲明和屬性可以被調用,可以被其他人看見,聲明的實現寫在.m 文件中
.m 文件實現.h文件的聲明方法,.m文件也有聲明,但是不可以被外部調用,只能在.m文件中作為全局變量使用. .m文件只有開發者可以看見,這里有封裝的思想.
interface就是一個接口,在.h .m文件中,用于寫聲明
@implementation :實現
實例化:就是將一個抽象的類提供一個具體的例子.相當于屬性賦值(不是初始化,初始化是init) [百科]在面向對象的編程中,通常把用類創建對象的過程稱為實例化 線性表是最基礎的數據結構.除了開節點,其他是線性排序.(基礎單元:節點)
迭代器模式:順序訪問聚合對象(數據,字典,集合等); (無用)
Masonry : 目前最流行的autolayout第三方框架.
由于OC是基于C語言編寫的,所以需要遵循C的一些特性
C語言 1.函數的聲明: 在C語言中,函數的定義是有規范的:默認情況下,只有后面定義的函數才可以調用才可以調用前面定義的函數.
2.如果想把函數的定義寫在main函數后面,而且main函數能正常調用這些函數,那么就必須在main函數前面聲明.
3.函數的聲明格式:你在main函數前面聲明過一個函數,mian函數就知道這個函數的存在.而且只要知道函數名,函數的返回值.函數接受多少個參數,就能調用這個函數,因此,聲明函數的時候可以省略參數的名稱. 寫函數聲明不寫函數定義 也會報錯.(鏈接錯誤)
因此我認為OC是這樣的
OC語言 1.方法的聲明,OC中,方法的定義是有規范的,只有加載到viewdidload中方法才會調用.(在A文件中我們需要引入B頭文件)
2.如果我們要調用B文件的方法,屬性,協議(B頭文件中有的),就必須先告訴編譯器,這個方法是存在的.
3.我們需要在前面先初始化B,然后才能調用它.(強行湊3個)
語法糖 : 也稱為糖衣語法,是指計算機語言中與另一套語言法等效開發者用起來卻更為方便的語法.語法糖令程序更為易讀,減少代碼出錯幾率.
例子:
NSString *str = [animations objectAtIndex:1];
NSString *str = animations[1];
NSArray *XX = [NSArray arrayWithObjects:@"aa",@"bb",@"cc",nil];
NSArray *XX = @[@"aa",@"bb",@"cc"];
NSString *xx = [NSString stringWithString:@"xxx"]; //不可用
NSSting *xx = @"xxx";
當然簡潔的方法需要建立在已經理解原意的基礎上,否則會導致語法混亂,兩種一樣的語法沖突. ------編寫高質量IOS與OSX代碼的52個高效方法. (現在蘋果系統叫Mac OS了)
便利構造器是一種快速創建對象的方式.它本質上是把初始化方法做了一次封裝,方便外界使用,在init的時候同時給屬性變量賦值的類方法.
類方法不能訪問成員變量,但是可以通過對象方法調用.
http://blog.sina.com.cn/s/blog_877e9c3c0101gpnz.html
http://www.lxweimin.com/p/215f7ad7b74c
工廠模式 http://my.oschina.net/leejan97/blog/311843
書寫規范類
每個OC對象實例都是指向某塊內存數據的指針.所以在聲明變量時,類型后面加"*",而常量就不需要.
有狀態的控件可以用set方法設置 = 需要你創建的對象與系統對象對應.這樣才能顯示.
cmd + shift + B 查看內存有無泄漏
interface :接口
引入一個文件調用 需要重定義;
數組是一塊連續的存儲空間(通過輸出%p 來觀察內存地址)
數組不可以進行整體賦值.
數組作為函數參數傳遞是地址傳遞會自動轉換為指針類型,基本數據類型是值傳遞.
結構體: 是對數據的封裝
函數 : 對功能的封裝
封裝的好處:
提高代碼的可讀性
提高數據的易用性
提高代碼的可維護性
for循環中 三個參數使用分號;是因為它們是三個不同類型的參數
類和類的實例(對象)沒有任何本質上的區別.任何類的定義都是對象.任何對象都是isa指針.
isa:是一個Class類型的指針.每個實例對象都有個isa的指針,而Class里也有isa的指針,指向meteClass(元類).
set:
- 作用:提供一個方法給外界設置成員變量值,可以在方法里面對參數進行相應過濾.
2.set方法后面跟上成員變量的名稱,成員變量的首字母大寫.
3.必須需要接受一個參數,而且參數類型根成員變量類型一致
4形參的名稱不能跟成員變量名一樣.
5.返回void
get:
1.作用:返回對象內部的成員變量
2.肯定有返回值
3.方法名與成員變量名一樣.
4.不需要接受任何參數
我們在自定義協議時,由于是寫在聲明的上面,所以要添加一個類.不然Xcode找不到相關的類. .h文件同時又叫接口文件.
CocoaPods是開發OSX和IOS應用程序的一個第三方庫的依賴管理工具.
字典轉模型(runtime) 消息轉發(多代理),
KVO 實現,方法交換
KVC:Key Value Coding :給模型屬性賦值
KVO:Key Value ObsevRing :監聽模型屬性值的改變
觀察者模式: 當一個物體發生變化時,會通知所有觀察這個物體的觀察者讓其做出反應。實現起來無非就是把所有觀察者的對象給這個物體,當這個物體的發生改變,就會調用遍歷所有觀察者的對象調用觀察者的方法從而達到通知觀察者的目的。
http://lastdays.cn/2016/02/22/base1/
//快速迭代 disatch_apply(線程名.count,queue,^size_t index){
}
http://weibo.com/bestswifter?is_hot=1#_loginLayer_1465972733804
解析: 將文件從你當前格式轉為你需要的格式.
json本質是一個特殊格式的字符串.(不是NSString) jsonObejectWithData
Instancetype
- instancetype 在類型表示上,跟id一樣,可以表示任何對象類型
- instancetype 只能用在返回值類型上,不能像id一樣用來參數類型上.
- instancetype比id多一個好處,編譯器會自動檢測對象的類型.
GCD
進程:系統正在運行的一個程序
線程:程序運行開啟的任務 (線程中任務執行是串行的,所以開多個線程)
每個程序都有一個主線程.稱為"主線程"或"UI線程"
主線程主要作用:
顯示/刷新Ui界面
處理UI時間
主線程關乎用戶體驗,選擇主線程需要注意.(統籌思想)
多線程:多個線程
原理:CPU通過極快的切換來處理多個線程,達到偽多線程.
多個線程會降低程序的線程,CPU資源有限.
技術方案:GCD,NSThread.NSOperation,pthread (使用頻率由高到低) //1創建線程后自動啟動線程 //2隱式創建并啟動線程
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:nil];
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
//睡眠狀態
[NSThread sleepForTimeInterval:3];
//選擇具體休眠時間
NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2];
//直接退出線程
[NSThread exit]
GCD 有倆個核心概念:
任務 : 執行什么操作
隊列: 用來存放任務(以及何時執行,執行次數)
GCD執行操作常用函數
//異步操作
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
//同步操作(只能在當前線程做); dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
同步(sync):只在當前線程中執行任務,不具備開啟新線程的功能,串行執行任務
異步(async):可以在新的線程中執行任務,具備開啟新線程的功能,并發執行任務
并發:多個任務同時進行.(異步線程用) 解鎖多線程
串行:多個任務順序執行;
//創建一個并發隊列 //參數1:創建隊列的名字 //參數2:執行同步還是異步操作
異步并發隊列
//獲取全局的并發隊列
dispatch_queue_t queue = dispatch_queue_create("com.babb.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
//或者這樣獲取全局的并發隊列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
DISPATCH_QUEUE_CONCURRENT:并發隊列
DISPATCH_QUEUE_SERIAL:串行隊列
GCD默認已經提供了全局的并發隊列,給整個工程使用,可以無需創建,直接調用. 使用 dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>) 函數獲得全局的并發隊列.
同步函數 + 并發隊列 = 不會開多個線程
異步串行
dispatch_queue_t queue = dispatch_queue_creat("com.xx.queue",DISPATCH_QUEUE_SERIAL); //將任務加入隊列 dispatch_async(queue,^{ NSLog(@"寫入任務"); });
//使用sync函數往當前串行隊列添加任務,會卡住隊列
獲取主線程
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue^ { NSLog("放入主線程中不管是同步異步都是不開新線程的"); }); //同步函數放入主隊列會導致邏輯沖突,發生錯誤.
dispatch_asnc(dispatch_get_global_queue(DISPATCH_QUEUE_DEFAULT,0),^{ NSLog(@"寫其他任務"); //回到主線程 dispatch_async(dispatch_get_main_queue(),^{ self.XX.YY = YY;
});
});
//延遲執行隊列
//方法一
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(),^{ NSLog(@"------"); });
//方法二
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:NO];
//單次執行 通常用于單例 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"----"); });
多線程的常見問題 資源共享,
多個線程共同訪問同一個資源,造成資源搶奪.需要加互斥鎖. @synchronized (self) { } 主線程精髓,將耗時操作留給子線程,UI界面留給主線程 子線程加載完程序,回到主線程加載數據.
[self.image performSelectorOnMainThread:@selector(touchesForView:) withObject:_imageView waitUntilDone:YES];
[self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:_imageView waitUntilDone:NO];
單例
//單例 單例必須加static 固定屬性; 它是類方法 .
單例模式:說白了就是一個類不通過alloc方式創建對象,而是用一個靜態方法返回這個類的對象。系統只需要擁有一個的全局對象,這樣有利于我們協調系統整體的行為,比如想獲得[UIApplication sharedApplication];任何地方調用都可以得到 UIApplication的對象,這個對象是全局唯一的。
寫音頻類軟件時我們需要創建一個字典。用來保存當前存在的下載。使單例持有它,從而不會被銷毀
緩存與下載的區別
- 緩存是當前程序內容保存,退出程序后釋放.
- 下載是將文件保存本地,退出后仍然存在.
邊下邊播,給一個錯誤的網址,讓程序走一個協議,這個協議可以請求你要下載的資源,實現邊下邊播的功能.
代理和通知的區別
代理:1個對象只能告訴另一個對象發生的事情
通知:一個對象可以告訴N個對象發生的事情.
//在Foundation框架中,使用NSJSIONSerialization對象來對data對象進行解析
//NSDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
//根據接口中的數據類型,將數據解析成OC中的數組對象或字典對象,如果接口最外層是字典就用字典接受,最外層是數組就用數組接受.
PHP
域名 . ip .公共部分 127.0.0.1
返回值參考
code msg 描述 1 成功 接口訪問成功 2 失敗 用戶名錯誤 3 失敗 密碼錯誤
1.登錄 拼接 /login.php? //參數 參數名 描述 是否為必填 userName 用戶名 是 passWord 密碼 是 參考鏈接: 127.0.0.1/login.php?userName=張三&passWord123456
返回值 { "code": 1, "msg": "成功", "result": { "userName": "abcdde", "age": 12, "phone": "110" } } -->
http及AFNetworking
http是客戶端與服務器端通信的一套超文本協議,制定了標準,規范
URL決定和誰通信
URL的結構 https://(通信協議) www.baidu.com(hostname 主機名稱)/baidu?wd=%E6%85%95%E8%AF%BE%E7%BD%91&tn= (/absolute-path路徑[接口名稱])monline_dg&ie=utf-8(?query查詢條件[接口字段])
www.cocoachina.com/industry/20131106/7304.htmlgdsg
常用方法 標準用法
- GET : 從服務器獲取一段內容,通常不包含請求體
- POST : 使用客戶端提供的數據更新實體
不常用方法
HEAD :獲取響應的元數據而無需檢索響應的全部內容 PUI :使用客戶端提供的數據添加實體 DELETE : 使用客戶端提供的請求體來刪除實體
NSURL 表示客戶端訪問哪臺服務器端的指定資源 (粗淺的講就是網址啦)
NSURLRequest :標識客戶端發起的網絡請求內容
NSURLConnection : 表示客戶端與服務器端建立的網絡連接接
NSURLResponse : 服務端給予客戶端的請求結果.
//表示訪問的服務器
NSURL *url = [NSURL URLWithString:@"http://www.imooc.com/"];
//表示客戶端發起的網絡請求的請求內容
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// NSURLConnection 此方法已經被NSURLSession代替了
NSURLConnection *connecction = [[NSURLConnection alloc]initWithRequest:request delegate:self];
//啟動網絡請求
[connecction start];
https://pic2.zhimg.com/3c73e679994145c986d2d935c691521d_b.jpg
數據相關
IOS的數據存儲 http://www.lxweimin.com/p/0cbc364d2ebc
架構
MVC : mode view controller
數據Model: 負責封裝數據、存儲和處理數據運算等工作
視圖View: 負責數據展示、監聽用戶觸摸等工作
控制器Controller: 負責業務邏輯、事件響應、數據加工等工作
mode類還持有倆個對象 item:是實際存儲數據的對象,和view中的屬性對應 Cache(緩存) MVVM
http://my.oschina.net/Jacedy/blog/603573
IOS真機測試
一:點擊系統軟件"鑰匙串??",在菜單欄選擇鑰匙串訪問--->證書助理--->從證書頒發機構請求機構請求證書--->跳出的窗口填寫(隨便談) 請求是那里尋存儲到磁盤(省事)-->繼續 -->跳出的窗口文件最好放在桌面---------文件.
二:百度 Apple Developer (不是Apple)-->在菜單欄右邊的Account登錄開發者賬號(普通蘋果賬號是無法申請證書的)-->左邊菜單欄Certificates,IDs&Profiles--左邊出現一側菜單欄-->Certificates-->Development-->點擊右側+號添加 ??搜索已添加證書 --> 按需選擇IOS APP Development(測試證書)APPle push Notification serviceSSL (測試推送證書) -->APP Store and HOC 發布證書 APPlePushNotificationservice SSL (發布推送的證書) --> 點擊下方的Worldwide DeveloperRelations Certificate Authorty (下載文件) ---> 點擊Continue按鈕 -->進入的頁面需要選擇文件->
三:找到剛剛下載好的文件雙擊打開 -->進入鑰匙串頁面-->點擊鑰匙串訪問->證書助理->從證書機構請求證書->填寫郵箱->存儲到磁盤->繼續->桌面-存儲-完成->回到瀏覽器頁面-->導入剛剛的文件-->continue-->點擊download按鈕下載->Done
四:打開Xcode,cod + 逗號 ,左邊點擊加號按鈕 填寫.