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