(id)數(shù)據(jù)類型:1、對(duì)象不需要*號(hào)
2、可以發(fā)送任何存在的消息
3、不能用.屬性
4、可以指向任何類的對(duì)象,而不關(guān)心其具體的類型
KVC和KVO
kVC 鍵值編碼 通過把屬性名當(dāng)成key 來(lái)改變屬性的值
KVO 鍵值觀察者 通過KVC的方式 把屬性當(dāng)做key 來(lái)觀察屬性值的變化 做出響應(yīng) 需移除觀察者
單例 (一個(gè)類的對(duì)象只能被使用一次)
通過方法 讓對(duì)象只創(chuàng)建一次 可以避免重復(fù)創(chuàng)建 節(jié)省內(nèi)存開支
使用環(huán)境:不需要重復(fù)創(chuàng)建的操作類中 封裝數(shù)據(jù)庫(kù) 網(wǎng)絡(luò)請(qǐng)求 某個(gè)固定的對(duì)象 不希望在使用的時(shí)候 被創(chuàng)建成其他的對(duì)象(當(dāng)前用戶)
單例的生命周期(從程序開始到程序結(jié)束)
寫一個(gè)單例
//單例
static User *user = nil;
@implementation User
+(id)defaultManager{
@synchronized (self) {
if (user == nil) {
user = [[User alloc]init];
}
}
return user;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
if (user == nil) {
user = [[User alloc]init];
}
return user;
}
static HTTP_Manager_Delegate *manager=nil;
//在多線程中的一個(gè)只能有一次的標(biāo)識(shí)符
static dispatch_once_t onceToken;
//多線程中 查看是否有一個(gè)帶有onceToken標(biāo)識(shí)的對(duì)象
dispatch_once(&onceToken, ^{
//如果沒有 創(chuàng)建
manager = [[HTTP_Manager_Delegate alloc]init];
});
//如果有 就return
return manager;
@class
僅僅是聲明一個(gè)類名,并不會(huì)包含類的完整聲明
能解決循環(huán)包含的問題:當(dāng)兩個(gè)類文件有循環(huán)依賴關(guān)系 ( A 引用 B , B 引用 A ) 時(shí),需要用 @class
import 和 #include
import 是 Objective-C 導(dǎo)入頭文件的關(guān)鍵字,完整地包含某個(gè)文件的內(nèi)容
會(huì)自動(dòng)導(dǎo)入一次,不會(huì)重復(fù)導(dǎo)入;
不會(huì)引發(fā)交叉編譯;
include
C/C++ 導(dǎo)入頭文件的關(guān)鍵字,完整地包含某個(gè)文件的內(nèi)容
會(huì)引發(fā)交叉編譯, 因?yàn)樵?Objective-C 中會(huì)存在C/C++和Objective-C 混編的問題,如果用 #include 引入頭文件,會(huì)導(dǎo)致交叉編譯
import<> 和 import""
<> : 引用系統(tǒng)文件,它用于對(duì)系統(tǒng)自帶的頭文件的引用,編譯器會(huì)在系統(tǒng)文件目錄下去查找該文件.
"": 用戶自定義的文件用雙引號(hào)引用,編譯器首先會(huì)在用戶目錄下查找,然后到安裝目錄中查
網(wǎng)絡(luò)請(qǐng)求:首先需要一個(gè)接口,還需要request(設(shè)置緩存方式,請(qǐng)求時(shí)間),需要連接服務(wù)器,請(qǐng)求數(shù)據(jù),解析;
AFN
全稱是AFNetworking,是對(duì)NSURLConnection的一層封裝
它運(yùn)行效率沒有ASI高,但是使用比ASI簡(jiǎn)單
它 實(shí)現(xiàn)推送,要一個(gè)接口,封裝參數(shù)(字典)、manager 設(shè)置請(qǐng)求格式 ,還可以post/get請(qǐng)求
get/post區(qū)別
get:url與參數(shù)封裝到一起,有長(zhǎng)度限制,安全系數(shù)低
post:url與參數(shù)分開,長(zhǎng)度不受限,安全系數(shù)高
block作用:
1、保存代碼。一段代碼在合適的時(shí)間執(zhí)行(請(qǐng)求成功時(shí)彈出一個(gè)提示框)。
2、block一般用來(lái)兩個(gè)的類的數(shù)據(jù)逆?zhèn)鬟f(修改昵稱的時(shí)候)
3、block也可以將一個(gè)操作當(dāng)做參數(shù)來(lái)傳遞
做回調(diào)函數(shù),可替代代理;
注:如果要在代碼塊里修改外部的局部變量的時(shí)候,要用__block或者_(dá)_weak修飾,不然會(huì)崩潰。
循環(huán)引用:
strong weak
delegate 可以用assign、weak
用weak,避免野指針(一個(gè)對(duì)象釋放了,但內(nèi)存沒有釋放掉)
UITableView的重用機(jī)制?.
tableView 出現(xiàn)界面卡死,或者上下滑動(dòng)出現(xiàn)卡頓現(xiàn)象的原因?
1、沒有使用重用機(jī)制;
2、滑動(dòng)cell時(shí),有耗時(shí)操作,阻塞主線程(只能用來(lái)更新UI)
多線程:用來(lái)處理耗時(shí)操作,增加用戶體驗(yàn)
多線程包括?
NSThread:開辟線程,需要手動(dòng)管理
NSOperation:需要有線程隊(duì)列,可以添加依賴關(guān)系,(如果不放在線程中,它不一定在子線程中)
GCD:NSOperation是基于GCD的封裝
1》為多核的并行運(yùn)算提出了解決方案
2》GCD會(huì)利用更多的CPU內(nèi)核,比如雙核,四核
3》GCD自動(dòng)管理線程的生命周期(創(chuàng)建線程,調(diào)度任務(wù),銷毀線程)
4》程序員只需要告訴GCD想要執(zhí)行什么任務(wù),不需要編寫任何線程管理代碼
- 1、創(chuàng)建視圖
- 2、創(chuàng)建一個(gè)串行隊(duì)列
- 3、用異步方式執(zhí)行串行隊(duì)列中的任務(wù)
- 4、加載網(wǎng)絡(luò)資源
- 5、回到主線程
- 6、更新UI
執(zhí)行隊(duì)列的四種方式:
串行同步
串行異步
并行同步
并行異步
數(shù)據(jù)持久化
常用的數(shù)據(jù)持久化方式有: 屬性列表(plist文件)、歸檔(存儲(chǔ)自定義的類的對(duì)象時(shí);存儲(chǔ)用戶的數(shù)據(jù)(昵稱,uid))、偏好設(shè)置(NSUserDefault(存儲(chǔ)一些簡(jiǎn)單的數(shù)據(jù)(用戶的設(shè)置)))、sqlite3、core data、FMDB(大量數(shù)據(jù)的時(shí)候) create table student IF NOT EXISTS (id
integer, name text, age text)
當(dāng)有少量基礎(chǔ)數(shù)據(jù)類型的數(shù)據(jù)和NSArray、NSDictionary需要儲(chǔ)存并且無(wú)需加密時(shí),就以使用plist文件
儲(chǔ)存少量的數(shù)據(jù),而且需要加密,比如登陸密碼、獲取的accessToken時(shí),或者需要儲(chǔ)存對(duì)象,比如做收藏夾、最近訪問,都可以使用鍵值歸檔
偏好設(shè)置的話就是儲(chǔ)存一些用戶設(shè)置信息,比如程序中設(shè)置當(dāng)中的一些開關(guān)的Bool值等
當(dāng)需要儲(chǔ)存大量的數(shù)據(jù)時(shí),比如需要離線緩存一些數(shù)據(jù),就需要使用數(shù)據(jù)庫(kù)了,sqlit3是c語(yǔ)言的東西,使用起來(lái)不是特別方便,而FMDB是oc對(duì)其的封裝使用起來(lái)比較方便,所以一般開發(fā)當(dāng)中都是使用FMDB
VFL(可視化格式語(yǔ)言)有幾個(gè)標(biāo)示符?
VFL:Visual Format Language 可視化格式語(yǔ)言
H:水平方向
V: 垂直方向
| 表示父視圖
- 本身表示一段距離
-距離- 就表示指定距離
視圖本身的寬度
[字符串表示的視圖] 表示自動(dòng)布局當(dāng)前視圖 參照視圖
[字符串表示的視圖(視圖的寬高 或者 最小最大的寬高或者相對(duì)寬高)]; 注意:()不要丟掉
H:|-50-[view1(>=100)]-50-|
V:|-100-[view1(30)]
使用自動(dòng)布局的步驟:
1.使用自動(dòng)布局 autulayout frame 就會(huì)失效 ——>不需要再去設(shè)置視圖的frame
使用代碼自動(dòng)布局的時(shí)候 需要禁用 translatesAutoresizingMaskIntoConstraints =NO
2.綁定視圖與字符串
3.添加約束
中國(guó)語(yǔ)言
橫向:距離父視圖左側(cè)100 視圖本身的寬度最小是100 距離父視圖右側(cè)是100
豎向:距離父視圖頂部150 視圖本身的高度是40
可視化語(yǔ)言
H:|-100-[view(>=100)]-100-|
V:|-150-[view(40)]
推送流程:
1、首先要有APPID;
2、根據(jù) APP ID 創(chuàng)建推送證書(根據(jù)需要?jiǎng)?chuàng)建不同環(huán)境下的推送證書)
3、再向推送平臺(tái)提供推送證書
4、向蘋果服務(wù)器發(fā)送設(shè)備信息 接收蘋果服務(wù)器發(fā)送回來(lái)的deviceToken
5、向推送服務(wù)器發(fā)送deviceToken
6、再推送服務(wù)器設(shè)置接收推送的用戶 以及推送的消息內(nèi)容 并發(fā)給蘋果服務(wù)器
7、蘋果服務(wù)器根據(jù) deviceToken 向用戶發(fā)送設(shè)置好的推送消息
8、手機(jī)端接收到推送消息 在自己的應(yīng)用中顯示
NSArray 和 NSSet的區(qū)別?
NSSet :
1、無(wú)序的、不重復(fù)的;存放到NSSet中的內(nèi)容并不會(huì)排序與添加順序也沒有關(guān)系
2、通過anyObject來(lái)訪問單個(gè)元素
3、遍歷NSSet中的每個(gè)元素。通過forin循環(huán)來(lái)遍歷
4、好處:效率高。
5、應(yīng)用場(chǎng)景:
比如重用Cell的時(shí)候,從緩存池中隨便獲取一個(gè)就可以了,無(wú)需按照指定順序來(lái)獲取
當(dāng)需要把數(shù)據(jù)存放到一個(gè)集合中,然后判斷集合中是否有某個(gè)對(duì)象的時(shí)候
*NSArray
1、有序的、可以有重復(fù)對(duì)象。對(duì)象的順序是按照添加的順序來(lái)保存的
2、好處:有序訪問
3、應(yīng)用場(chǎng)景:在絕大多數(shù)需要依賴順序的情況下(比如tableView的數(shù)據(jù)源集合,在實(shí)際操作中要根據(jù)下標(biāo)來(lái)獲取對(duì)象)
4、通過下標(biāo)來(lái)訪問
收藏、最近
收藏和最近主要就是使用工具類對(duì)數(shù)據(jù)進(jìn)行增加和刪除,保存數(shù)據(jù)時(shí)要重寫數(shù)據(jù)的equalto方法(因?yàn)橛?jì)算機(jī)是根據(jù)內(nèi)存地址比較的,而有時(shí)候內(nèi)存地址雖然不同,但是儲(chǔ)存的數(shù)據(jù)確實(shí)一樣的,所以一般根據(jù)數(shù)據(jù)的位置標(biāo)識(shí)(例如id值)比較)
如果是做最近,就需要將上一次的數(shù)據(jù)刪除,添加新的數(shù)據(jù)進(jìn)來(lái),如果在搜藏是需要記錄控件的編輯和選中狀態(tài),就需要在數(shù)據(jù)模型中添加相應(yīng)的屬性,利用數(shù)據(jù)來(lái)控制控件的狀態(tài)
常出現(xiàn)的問題就是使用tableview時(shí)會(huì)出現(xiàn)循環(huán)利用的問題,這個(gè)問題就可以使用數(shù)據(jù)的值來(lái)避免,每次加載cell時(shí),他的狀態(tài)是受數(shù)據(jù)控制的,數(shù)據(jù)不會(huì)發(fā)生循環(huán)利用的問題,這個(gè)問題也就不會(huì)出現(xiàn)了
加載本地圖片有哪些方法?
1、imageNamed
2、dataWithContentsOfFile
3、使用[UIImage imageWithContentOfFile:] 或者[image initWithContentOfFile:]
這些知識(shí)我整理的一小部分,如果有什么錯(cuò)誤,希望指出,我們共同進(jìn)步。