總結 總結 總結html
命名規範課題前端
NSString 爲何用copy修飾java
Nsstring比較特殊 繼承nsobject oc將他歸到oc對象。mysql
Oc對象都是動態分配內存 存放到堆區ios
例如 @「dancer」 只是把數據區的字符串 進行了一個類型轉換,oc把他當成字符串對象處理,例如@「dancer」並非存在堆區,並非動態分配出來的c++
咱們沒法判斷這類字符串何時釋放,若是釋放,指針指向他毫無心義程序員
?????web
***** objective-c 動態性objective-c
編譯時/運行時sql
編譯時 詞法/語法檢查,將代碼 編譯成計算機執行語言 裝到內存中跑起來
運行時
動態類型:
譬如id類型修飾的對象 爲動態類型對象 編譯時並不知道是什麼類型 運行時纔會檢查肯定出對象的類型
iOS 自省方法
is Kindleofclass 檢查運行時對象類型
is Memberofclass
動態綁定
基於動態類型 當運行時對象的類型被肯定 類的原有的屬性 方法被肯定,也包括運行時添加的方法 屬性,這就是所謂的動態綁定了
核心就是運行時 動態添加屬性,方法
動態加載
1 動態資源加載 例如1x 2x 3x 圖片 ,程序會根據機型動態加載 不一樣分辨率的圖片
2 可執行代碼的動態加載,譬如懶加載
譬如懶加載數組
-(NSArray *)countArray
{
If(!_countArray){
_countArray = [[NSArray alloc] init];
}
Return _countArray;
}
[self.countArray addObject:@「」];
***** 關於kvo:
1 監聽機制,基於NSObject 兩個方法willChangeValueForKey 和didChangeValueForKey,實現的。
2 當給一個屬性添加觀察者時候,運行時,會建立一個繼承對象所屬類的派生類(子類),而且重寫被觀察屬性的set方法,默認一個對象的isa指針會以前所屬類,而這是isa會指向這個新的派生類,因此其實被觀察的屬性的賦值操做是在這個派生類 裏實現的。
3 的當被監聽的屬性發生改變前,調用willChange方法 記錄舊的值,改變結束 調用DidChangeValue新的值,出發kvo監聽方法。
Ps 對象isa指針默認所屬類 class類裏面也有個isa指針 指向元類 元類裏包含調用的 1 方法列表 2類的版本信息 3成員變量數組ivars等
*****kvo應用場景
1 推送消息 消息時 放數組裏面 咱們的birgeValue顯示紅點提示 須要兼監聽數組改變 給提示
2 視頻 監聽進度條
3 作輪播圖監聽 scrollview 監聽contentOffSet
***** 深拷貝 淺拷貝
1 最大的區別就是 有否建立新對象。深拷貝內容拷貝,淺拷貝指針拷貝(內存地址拷貝)
2 深拷貝,修改一個對象不影響另外一個對象。
3 淺拷貝,修改一個對象影響另一個對象
簡單說:
深拷貝:指針指向一塊新建立的內存
淺拷貝:指針指向一塊已經存在的內存
大致上 copy mutable copy 策略是深拷貝
retain strong是淺拷貝
***** Super /self 總結
***** SDWebImage細節
1 sd_setImageWithURL
2 SDWebImageManager 單例 downloadImageWithURL
內部 SDImageCache類(nscache)以以url爲key queryDiskCacheForKey方法 Memory Cache 以url爲key去內存中查詢緩存圖片,若是沒有 Disk Cache:去磁盤上找。
若是磁盤找到,會將圖片設置到memory cache中。
3 若是緩存數據查詢成功,則返回,不成功則請求網絡self.imageDownloader down…
4 若是下載成功 [self.imageCache storeImage]儲存 completedBlock回調前端展現
ps 磁盤緩存清除策略
1 清理過時緩存
2 清理寫入時間早的圖片
@interface SDImageCache : NSObject
@property (assign, nonatomic) NSInteger maxCacheAge;//最大緩存時間
@property (assign, nonatomic) NSUInteger maxCacheSize;//最大緩存空間
//設置最大緩存空間
[SDImageCache sharedImageCache].maxCacheSize = 1024 * 1024 * 50; // 50M
SDWebImage Bug
磁盤圖片渲染以前,須要獲得圖片的原始像素數據,而後去作繪製操做,因此圖片須要解壓縮。
***** 公司刷新 流程
size :取多少
offset:從哪裏取
count:總數
刷新:
設定size 20條 10條,offset 爲0 加到數組中
加載:
設定size20條 10條,第一次 獲取數據數組長度 offset 從這取值 取size條,加到數組。
判斷更多 has 數據數組個數< count總數
設置footer view 給個提示 沒有更多
***** SVPullrefresh 原理
建立個scrollView的分類 分類添加屬性,刷新頭部顯示的view 高度60 ,添加頭部刷新view爲scrollview的觀察者,監聽contentOffSet的改變,刷新頭部view 有幾種狀態,加載狀態,初始狀態,中止狀態,拖拽狀態,在觀察者監聽方法裏面,根據幾種狀態切換執行layoutSubview的顯示
*****bug
Bug復現:當下拉刷新 拽的不是太多時候,他會先調上拉加載,在下拉刷新。
緣由:1 svpull的頭部/尾部試圖都是scrollview的觀察者,監聽contentOffSet,2 當拖拽時候結束,scrollview代理結束 兩個都調用,設置刷新狀態,操做ui。
方案:加判斷,scrollviewdidScroll 拖拽結束,判斷當前偏移量 若是y>0 作上拉加載時候,設置加載狀態 loding狀態
uiscrollview的分類
/**********************************************************************************/
*****tableview 滑動 cell 崩潰 (會議人氣榜)
且僅僅4s崩潰,其餘的不崩潰 並且會有內存明顯的飆升 正常100左右飆升到800
斷點調試 崩潰在sdwebimage裏面 沙盒取出的圖片轉碼 轉位圖時候,正常咱們設置圖片imageview setimage 都是在主線程中設置的 這其就包括解壓圖片爲位圖(很耗cpu) 而後calyer在view上作渲染。sdwebimage作法是開子線程去去作這個位圖的解壓縮,而後緩存 供ui使用,去沙盒中去圖片的時候不作任何處理,直接取,此次奔潰的緣由就是後臺返回的圖片太大 3000*5000,方案有兩個第一大圖片不處理 不解碼這樣性能差點 但不崩潰
第二種是 沙盒取出的圖片 先等比壓縮下。
個人方案是綜合下 沙盒取出圖片先判斷若是款大於屏幕寬度 等比壓縮下,小的不壓縮,而後再去轉碼
******* 線程同步
防止資源搶奪,讓線程同步進行,能夠加互斥鎖/NSLock,
@synchronized(obj):針對對象 ,保證在多條線程同時操做obj時候,一條線程執行完,在執行另外一個
NSLock:針對方法,給一條線程中操做對象的方法加鎖,保證一條線程執行完,在執行另外一個
場景:三方庫
******* 多線程場景應用
qq分享要求的圖片1m之內,後臺傳的圖片1.2m發佈出去 回調不掉。
方案:下載圖片nsdata datawithurl 網速慢直接卡死 要開線程 圖片存儲沙盒,等比壓縮圖片
******* 信號量 GCD實現 設置線程併發數 / 設置線程順序
信號量:資源計數器
信號量介紹:
資源計數器,對於信號量有兩個操做達到互斥 v(發送信號)/p(信號等待)
當一個操做執行A 執行p操做,信號量爲-1未零,系統規定信號量爲0,等待,操做A執行完畢,執行v操做,信號量+1,釋放資源,線程B才能夠執行.經過信號量來達到互斥操做.
方法介紹:
1 建立信號量 指定資源數量
2兩個重要參數 發送信號(V),等待信號(P)
part 1 設置線程順序 (經過一個執行,其餘阻塞的方式實現順序)
1 設置信號量爲1,開啓一條線程操做時候信號量-1,當前程序信號量爲0,則其餘線程操做阻塞狀態,噹噹前線程執行結束,信號量+1,則其餘線程操做 恢復執行.
2 經過開啓一條線程,來阻塞其餘線程,來實現多線程執行順序.
part 2 設置線程最大併發數
一樣設置信號量 爲3,來實現最大線程併發數爲3的功能
1 信號量爲三,意味着能夠開啓三條線程操做.
2 一樣經過開啓一條線程 信號量-1 線程指向完畢 信號量+1,實現程序運行中,有三條線程能夠執行多線程操做,從而實現最大線程併發數.
******* xmpp 環境配置
材料:openfire服務器 mysql數據庫(默認裝到控制面板)
1 openfire mac版 基於java開發的 因此要求電腦有java運行環境
沒有的話須要安裝jdk 查看java運行環境 終端執行命令 運行java -version
2 mysql (服務端的數據庫)使用是須要有帳戶密碼默認裝到控制面板)
1》安裝完 mysql 默認帳戶是root 密碼爲空
2》終端命令配置命令行配置 開啓mysql 並設置密碼
3》建立的數據庫默認四個文件 有個test文件
4》管理工具navcat 還有個海豚(mysqlworkbeech)的 登陸輸入鏈接名稱(自定義)輸入IP地址 端口號默認3306
帳戶名稱 root 密碼(你配置過得)配置的數據庫名稱爲你自定義的名稱
3 關聯openfire 和數據庫1 導入openfire數據表文件到mysel(建立字段包括用戶等)
1》openfire創建數據庫文件openfire數據庫編碼選擇utf-8的
2》默認open fire數據庫安裝到/user/local/openfire/ 數據庫腳本保存在/user/local/openfire/ /resources/database/中
支持不少種數據庫 保存mysql的數據庫到桌面 導入到mysql中,這樣mysql就添加好數據庫字段了
4 關聯openfire 和數據庫1 後臺管理設置關聯數據庫mysql
後臺配置 選中驅動類型:mysql 指定mysql路徑 輸入mysql 用戶名密碼:root 密碼:123456
配置openfire 後臺帳戶密碼 admin 123456
設置jid:
***** const / #define 宏定義
const c/c++ 定義常量的關鍵字
#define 預編譯指令
>>相同點
都能定義常量
>>不一樣點
1 從內存分配角度,
const 編譯器不會爲他分配內存空間,而是存儲在符號表中,,做爲一個常量存在,在編譯時不會有存儲/讀取內存的操做
#define 編譯時候,,每次賦值操做,先進行宏替換,而後都開啓新的內存
因此 在運行時 const只被拷貝一份,而 #define 能夠有若干個拷貝 const效率會高於#define
2 從使用角度
#define 能夠定義函數,能夠定義單例,而const不能夠
備註: 蘋果推薦使用const 由於const是在編譯階段,會編譯檢查報錯;而宏定義,在預編譯階段 僅僅是替換 編譯階段 不檢查類型
From http://www.cocoachina.com/ios/20160519/16342.html
***** static / extern 全局變量 局部變量牛逼閃閃
static:修飾變量(全局,局部)使用 / 全局變量/static變量 存儲在靜態區 程序運行 只初始化一次
兩個做用
Part1 :局部變量copy 進靜態區,延長局部變量聲明週期,程序運行期間 一直存在
Part2: 防止全局變量外部引用,外部引用extern
》》修飾局部變量:
做用:延長局部變量生命週期 (相似給局部變量變爲全局變量的意思!)
ps:局部變量自己存儲堆棧區,方法結束局部變量隨之銷燬;static修飾後將局部變量copy到靜態區,修飾後變量在運行中在靜態區給局部變量分配一次內存空間,且僅僅執行一次,程序運行期間變量一直存在不會銷燬。
ps:打點斷 ,發現下次執行這裏斷點過到下面去了。
》》修飾全局變量:
主要是做用域的問題,static修飾後僅在本類中可使用,沒法extain引用,全局變量則能夠外部引用。
場景:int作自增運算
extern:外部引用 UIKIT EXTERN(牛逼閃閃的宏定義 吼吼~~)
一個類中聲明(即便寫在方法裏面也無妨),另外一個類extern 能夠直接引用。
備註:1 其餘類聲明NSString *abcdefg = @「紅咔嚓雷「,
2 當兩個類同時聲明NSString *abcdefg 則編譯報錯,兩個文件同事O文件報錯 解決:
ps:無需等到程序會否執行到該方法,程序啓動即分配內存空間,因此無需加載到該方法。
ps:我的理解,相似經過extern關鍵字從靜態區 引出一個全局變量的意思,而後從新聲明,使用。。。
全局變量:變量存儲在靜態區,程序運行時分配一次內存空間,而後不會再去執行了。
局部變量:存放在棧空間中,方法執行結束,變量銷燬。
????爲何 類方法 要用static 修飾全局變量
***** 堆棧
棧 編譯器管理內存 棧的容量是系統預先設定好的 超了就會overflow ,分爲動態分配/靜態分配,局部變量 靜態分配;靜態/動態分配 都是由編譯器管理內存的
堆:程序員手動管理內存 堆都是動態分配內存的
***** @autoreleasepool
@autoreleasepool :做用避免內存峯值
數據比較
加上 @autoreleasepool 內存恆定在27
不加上 @autoreleasepool 內存27起 勻速飆升 結束53
Ps:在自動釋放池中 調用autorelease方法纔會被放到自動釋放池,方法結束,纔會對對象發送releas方法
結論:當出現大的for循環 且循環體內api爲 @autorelease時候建議加autoreleasepoor
且:autoreleasepool 不能優化全部的循環
******************* ******************* ******************* ******************* ******************* *******************
引伸:@autoreleasepool應用場景
1> 大數字for循環時候,調用autorelease API方法時候,加入@autoreleasepool{}避免內存峯值
例如:拼接字符串操做,stringWithFormat API建立字符串,臨時變量被大量建立,持續開闢內存,內存持續飆升....for循環結束,對象纔會銷燬,此時加入@autoreleasepool 會有幫助
若是字符串是alloc 出來的,非autorelease API 則 @autoreleasepool 是無效的
***** 項目性能優化
1 懶加載 場景:初始化UI控件 2NSDateFormatter(日期格式化)
2 tableview優化 實現: 高度,數據 提早緩存,tableview只作賦值運算 減小subVies數量,rowHeight sectionHooterHeight 直接設定,少用代理
3 常識注意
***** NSURLCache
緩存原理 NSURLQequest 對應一個NSURLURLCacheResponse
緩存NSURLCache *cache = [NSURLCache shareURLCache];//掌握全局緩存
***** Block常識
***** Block常識 (一)
方法經常使用聲明:@property (copy) void(^MyBlock)(void); 若是超出當前做用域以後仍然繼續使用block,那麼最好使用copy關鍵字,拷貝到堆區,防止棧區變量銷燬
定義block
typedef NSString (^WebBaseHandlerBlock) (NSDictionary *retInfo, NSError *error);
屬性block
@property (nonatomic ,copy)abcBlock myblock;
@property (nonatomic ,copy)void (^youBlock)(NSString *);
_weak typeof(self) weakSelf = self;
所以,__block和__weak修飾符的區別實際上是挺明顯的:
1.__block不論是ARC仍是MRC模式下均可以使用,能夠修飾對象,還能夠修飾基本數據類型。
2.__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數據類型(int)。
3.__block對象能夠在block中被從新賦值,__weak不能夠。
PS:__unsafe_unretained修飾符能夠被視爲iOS SDK 4.3之前版本的__weak的替代品,不過不會被自動置空爲nil。因此儘量不要使用這個修飾符。
***** Block和copy (二)
爲何要用copy:出於做用域考慮,默認block 存放在棧中,函數調用,棧分配內存,函數結束釋放內存,block 銷燬。再次調用block 時候報錯野指針錯誤。當前block 變量指向的被釋放的內存地址。因此須要copy到堆中,包住block的命。
「他自己的做於域是屬於建立時候的做用域,一旦在建立時候的做用域外面調用block將致使程序崩潰。」
***** Block copy/strong (三)
使用retain也能夠,可是block的retain行爲默認是用copy的行爲實現的,
由於block變量默認是聲明爲棧變量的,爲了可以在block的聲明域外使用,因此要把block拷貝(copy)到堆,因此說爲了block屬性聲明和實際的操做一致,最好聲明爲copy。
***** Block copy/strong 擴展
block幾種類型NSGlobalBlock NSStackBlock
block內部不引入外部變量:__ NSGlobalBlock
block內部引入外部變量 :__ NSStackBlock
***** weak 實現原理
runtime維護這個一個weak表(哈希表),記錄已對象的地址爲key,value爲 全部指向該對象的weak弱指針地址的數組,當對象銷燬時候經過weak表中該對象地址的value,查找到存有全部弱指針的地址的數組,賦值爲nil,而後從weak表中刪除。
對象銷燬 會調用objec_clear_deallocating函數
PS:怎麼找 對象地址 對應全部指向給對象的weak指針數組
block 使用
===場景1
譬如 協議中封裝一個 push控制器的操做
調用方:
[**** **block^(id obj ,NSInteger type){
if(type ==1){
[self.navagation pushViewController:obj animation:YES];
}
}];=
+(void)**. ** :(**block)block
{
Uiviewcontroller *obj = [[UIViewController alloc] init];
if(block){
block(obj,1);
}
}
===場景2
譬如 封裝一個 請求url block操做
調用方
[webbasehander geturl:@「」 dict:dic block^(id result ,NSError error)
操做result
[self.table reloadData];
];
{
配置url
配置請求參數
[self request:url:block];
}
{
ASI 請求
Request completionBlock{
block(dic,error);
}};
}
總結 :當 封裝方面 設置好數據 觸發調用方的block,調用方獲取到值 ,操做後續部分
assign weak 區別
assign:修飾對象,和基本數據類型;當被修飾的變量指向變量釋放或置空,會出現野指針錯誤!
weak:只能修飾對象,不會出現野指針錯誤,當被修飾的變量指向的變量釋放或是置空,被修飾變量指向nil,不會出現野指針錯誤。
引伸
***** 內存分析
靜態內存分析 analyze、分析/ 藍色
例如:邏輯錯誤
logic error / Dead store/Memory
不是太準 不可變賦值給可變數組 ,調方法時候傳入的字典參數未實例化
動態內存分析 profile -allocation /leaks 側面/分配/泄漏
***** IOS 繪圖
Ios圖像繪製三種API
1 UIKIT
UIBezierPath (畫線,橢圓 角度 照相機) UIImage 顯示圖像
2 CoreGraphics/ Quartz 2D (c語言函數API)
Quartz 2D 是2d繪製呈現引擎
CoreGraphics CGContent CGPath CGLayer CGBitmap
3 Open GL
支持2d/3d
CoreAnimation 算動畫引擎
*****手勢 響應者鏈條
分兩塊,
1 定位接收者
2 響應者鏈條
1定位接收者 當點擊屏幕的ui觸發一個事件,流程是事件添加到UIAplication的事件組,傳遞事件經歷 window ,父控件且判斷控件是否接受事件,若是是,則父控件遍歷子控件,判斷當前出發點是否在子控件上,繼續遍歷直到找到觸發該點的最後一個子控件,事件傳遞不能夠斷,覺得這全部控件務必能夠處理事件,獲取執行觸發事件的控件。
ps:這就說明了 爲何交互期間中間有個什麼uiimageview等不能交互的父控件,致使子控件不接受響應事件
能夠接受響應事件的控件須要繼承UIResponder 但還不夠 須要能夠交互 不是隱藏的 alpha值不是過小
2 響應者鏈條,功能是一個事件的發生,能夠被多個控件獲取。回傳靠的是super執行方法
舉例子:view上事件觸發 默認事件互傳給父控件,繼續回傳父控件,控制器.view 控制器(同樣繼承uiresponder);若是控制器還有父控制器那就父控件傳遞 給控制器 而後self.view 而後父控制器 window uiapplication
*****runloop
五中模式
1 UITrackingRunLoopMode
2 NSDefaultRunLoopMode
3 內核
4 開始
5NSRunLoopCommonModes = UITrackingRunLoopMode + NSDefaultRunLoopMode
獲取兩種方式 mainRunLoop currentRunloop
nstimer 會用到
平時api [NSTimer schedulerTimerWithTimeInterval:1.0 targer:self selected:@selected(timerMethod)userInfo:nil repeats:YES]; // NSDefaultRunLoopMode 默認用的這個 因此處理滑動ui時候 timer 掛起 不執行了
repeats:YES
因此仍是 須要實例化
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 @selected(timerMethod)userInfo:nil repeats:YES ];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:runLoop withMode:NSRunLoopCommonModes];
*****CALayer 詳解 CALayer /UIView
CALayer : 負責繪圖 屬於quartzCore框架,是一套跨平臺繪圖框架(Mac osx,ios)因此 layer.backgroundColor是CGColorRef,(由於Mac osx 沒有UIKit,osx不是觸摸交互的)
UIView : 繼承UIResponder 能夠作交互,屬於UIKit框架 負責構建用戶界面和管理內容.
關 系 : 簡單的說就是 UIView內部封裝了一個CALayer的對象,calayer對象負責繪圖部分,UIView負責交互和管理內容.
當對UiView進行繪製操做屬性時候,例如frame center backgroundColor,實際會調用對應layer的相關方法
例如調用 view setframe 實際會調用layer的 positon bounse anchorPoint
備註:
CALayer 屬性 position anchorPoint(錨點) bounse size transform等
UIView的frame其實是由center 和bounds來決定的
UIkit 構建界面,相應事件
錨點與中心點重合,默認0.5-0.5,
Layer內含隱士動
https://blog.csdn.net/u013282174/article/details/50215605
*****TCP UDP 協議——
TCP (傳輸控制協議):
1 創建鏈接,造成數據通道
2 傳輸數據大小不受限制
3 三次握手,創建長鏈接,安全協議
4 必須創建鏈接,效率稍低
UDP(數據報協議):
1 無需創建鏈接,將數據源及目的封裝成數據包
2 傳輸大小有限制 小魚64kb
3 無需創建鏈接,非安全協議
4 速度快
*****get post tcp udp 傳輸協議等 ???
*****註冊登陸 加密流程 對稱非對稱加密 ????—
*****你在公司負責什麼——
*****上傳app 推送 ——
*****數據庫 sqlite語句——
*****公司緩存策略 首頁等——
*****多線程應用 線程同步等 什麼線程池
*****runtime 應用場景 事例介紹 ——
場景1
控制器釋放打印( 添加屬性 關聯)
奇葩:logDealloc對象 管理打印信息
原理:
1 push每次新建控制器,initXib調用分類方法 建立一個logDealloc對象 用個屬性記錄當前類名
2 防止方法結束對象釋放,在分類中須要,用個全局變量保存該對象(屬性爲類名),由於是分類因此關聯建立屬性,
3 pop控制器(本類)銷燬,分類銷燬,logDealloc對象銷燬,調用對象logDealloc的dealloc方法 打印類名
場景2
控ios默認字體Heiti SC
*****web跳轉———
*****單例模式—
*****鏤空的遮罩
nsmarch port???
0 思路:蒙版.layer.mask = layer對象
1 建立蒙版
2 繪製貝塞爾路徑 添加反轉圖形(疊加部分會鏤空)
3 建立layer(CAShapeLayer子類).path = 貝塞爾路徑.path
4 設置 蒙版.layer「.mask = layer對象
建立表
create table if not exist t_student (primary key autoincrement,id integer ,name text not null,age integer default 18,)
建立表 create table if not exist 表名(字段 類型 約束,字段類型 約束,…)
增
insert into t_student (id,name,age) values (001,「小明」,20);
刪除
delete from t_student where age>20 and name 「小明」;
改
update
公司緩存機制
#define HUIYIONELEVELCACHES [YYUtil CreatCacheschilderPath:@"HUIYIONELEVELCACHES"]//會議頁面研究報告1級分類緩存
/var/mobile/Containers/Data/Application/6AB6ABF0-29D8-415C-A71A-239D802FF9D0/Library/Caches/AppCaches/HUIYIONELEVELCACHES
心得體會
上線 要注意是否有 版本升級問題
播放url 視頻注意轉碼 防止地址中帶中文
[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSMachPort ???
遞歸鎖
runloop
內存管理
哈希表
二叉樹
自動釋放吃
推送
本地推送:
http://www.cnblogs.com/ly1973/p/8848459.html
遠程推送
http://www.cnblogs.com/ly1973/p/8848404.html
分享
三方登陸
推送
Im即時通信
視頻開發
內存泄露
性能優化
緩存
音樂播放
數據統計
數據庫加密
打包上線
多線程
決定是否開闢線程 看同步/異步 不是看隊列