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