一、表格上滑則導航欄消失,下滑則導航欄出現,自帶動畫。前端
self.navigationController.hidesBarsOnSwipe = YES;ios
二、導航欄默認的模糊背景是由於系統自動設置了背景圖片,下面代碼能夠清空背景圖片,讓導航欄變成透明狀web
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];sql
三、導航欄下方有一根像素爲1的線,下面代碼能夠清空它數據庫
self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init]swift
四、自定義窗口UIWindow視圖,默認狀態下其是隱藏狀態,必須手動設置爲不隱藏才能顯示(主窗口的建立除外)數組
UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; window.hidden = NO;xcode
五、iphone自帶頂端下拉\底部上拉狀態消失後會發出應用程序進入活躍狀態的通知UIApplicationDidBecomeActiveNotification瀏覽器
六、[NSDate date]方法獲取的是系統當前時間,若用戶手動修改系統時間,則該方法返回值會發生變化緩存
七、定時器NSTimer\CADisplayLink均會強引用target自己,若其爲target屬性時須要注意循環引用,設置爲nil可打破循環
八、UIAlertController事件回調有延遲大概0.5s,若其附帶輸入框,則鍵盤會在事件回調執行結束後才收起,效果不好。只能自定義視圖解決
九、表格視圖cell高度緩存用NSCache,注意最好別用indexPath做爲key,由於下拉刷新時必須本身將全部緩存清空,使緩存失效。上拉可沒必要
十、我所碰到過的內存泄露狀況,即控制器不銷燬
a、block循環引用
b、定時器對self的強引用
c、視圖添加動畫,同時寫了scaleAnimation.delegate = self; scaleAnimation.removedOnCompletion = NO;
緣由:動畫代理對控制器強引用,而動畫完成後又沒有從圖層樹移除,循環引用。
加後面那句代碼緣由:在viewdidload方法中添加動畫,若不寫這句代碼則動畫不會執行,能夠採用GCD延遲如0.1s再執行動畫避免加這句代碼。
也可加這句代碼,可是當動畫完成後移除動畫圖層。
十一、視圖的frame.size和bounds.size不一樣的狀況:
a、視圖transform有旋轉或縮放時
b、圖片在scrollView中縮放時
十二、swift中addtarget多參數方法:
btn.addTarget(self, action: "function:parameter2:parameter3:", forControlEvents:.TouchDown)
func function(parameter1: Int, parameter2: Int, parameter3: String) {}
即函數名:第二個參數:第三個參數:,注意,按鈕點擊事件參數類型不能爲上面所寫的String,能夠爲NSString,Int,NSArray等其餘類型,緣由不明
1三、打破block循環引用方式:
a、__weak弱引用。經常使用方式,缺點,因爲不對外面對象進行強引用,block執行時該對象可能已經被釋放
b、__blcok修飾變量,執行block後將其置nil。優勢:強引用外部對象,保證其生命週期。缺點:必須執行block才能避免內存泄露
blk_k blk; { id arr = [NSMutableArray array]; __block id blockArr = arr; blk = ^(id obj){ [blockArr addObject:obj]; blockArr = nil; }; } blk([NSObject new]);
1四、服務器返回字段有時會是<NULL>,對應OC中的NSNull對象,與nil不一樣,好比將其賦值給label.text會崩潰。
我的認爲區別:null是一個NSNull類型的單例對象,有具體變化的類存地址,對其發送消息會崩潰。nil內存地址始終是0x0,發送消息不崩潰
1五、一個UI對象用transform旋轉180度時,老是順時針旋轉,沒法經過設置-M_PI的方式讓其逆時針旋轉。採用下面方法可講其順時針->逆時針->順時針依次旋轉。原理:就近原則
static NSInteger flag = 1; flag *= -1; CGFloat angle = M_PI + 0.00001 * flag; [UIView animateWithDuration:2 animations:^{ self.redView.transform = CGAffineTransformRotate(self.redView.transform,angle); }];
1六、Instruments
a、時間分析器Time Profiler:用來檢測CPU的使用狀況,查詢某個方法消耗的CPU時間,找出CPU性能瓶頸
b、Core Animation :滑動時的FPS,顏色等
b一、Color Blended Layers:基於渲染程度對屏幕的混合區域進行綠到紅色的高亮,因爲混合色,對GPU性能有很大影響
b二、Color Offscreen-Rendered Yellow:離屏渲染黃色高亮,極可能須要用shadowPath或shouldRasterize優化
c、OpenGL ES驅動:GPU的利用率,性能瓶頸
c一、Renderer Utilization: 若大於50%,多是離屏渲染或過分重繪,須要優化
c二、Tiler Utilization: 若大於50%,圖層幾何結構限制,如太多圖層被佔用
1七、
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if (url) {[[UIApplication sharedApplication] openURL:url]; }
上面代碼會自動打開app關聯的設置位置,好比你的app有消息推送,地圖等,當用戶關閉了訪問權限時,這些功能則沒法使用,能夠在使用時彈出提示框提示用戶打開權限,再調用該方法直接跳轉到相應位置設置
1八、圖片解壓:用 imageNamed:從 bundle 里加載不會馬上解壓。而是在賦值給 UIImageView 的 image 或者 layer 的 contents 或者畫到一個 core graphic context 裏纔會解壓。對大圖片必要時可採用後臺draw方法解壓,後再賦值的方式減輕解壓時CPU壓力,避免卡頓
1九、JS和OC交互方式: 攔截協議、JavaScriptCore、三方框架WebViewJavaScriptBridge、WKWebView
20、項目優化點
a、內存: 1.圖片讀取方式(imageNamed:有內存緩存,imageWithContentFile沒有內存緩存)、2.表格cell複用、3.自動釋放池、4.dealloc打印查看控制器和視圖是否銷燬
b、用戶體驗:1.AFN和提示框組合封裝,設置提示框延時出現時間,網絡優良時不出現、2.push進界面,避免網絡未返回時界面太難看,或者網絡一返回界面出現向下移動等,採用矇蔽優化、3.屏幕適配,防止輸入框被鍵盤擋住、4.UIAlertController點擊按鈕系統反應會延遲約0.5s,沒法解決,自定義視圖解決
c、性能優化:1.大量IO操做如從沙盒讀取大量圖片考慮線程解決、2.大圖片注意顯示那一刻纔會解壓,耗費CPU,能夠考慮後臺cos2D解壓,再設置、3.表格中有大量定時器時,定時器能夠運行在後臺線程,注意定時器複用,注意開啓runloop、4.UIimageview尺寸最好跟圖片大小一致,動態拉伸耗費性能、5.表格視圖中cell上面,最好別設置動畫、透明度、圓角、陰影等,能夠用Instruments測試下FPS,若太低能夠用上面的Instruments分析方法優化、7.儘可能別重寫drawRect方法,會引起離屏渲染,能夠用UIBerzePath和CAShapeLayer畫圖、8.性能優化利器,緩存,緩存,緩存、9.避免頻繁建立銷燬視圖,能夠用懶加載,不須要時removeFromSuperView,須要時加上、10.避免無效網絡請求,退出視圖取消網絡請求,同一個網絡請求連續屢次發送(如玩賺寶購買頁面輸入購買金額,實時網絡請求計算收益)取消掉上一個網絡請求,避免前一個網絡請求返回延後使數據錯亂
21 、我碰到過的AppStore被拒絕狀況
a、app中設置了更新版本選項
b、開啓後臺定位模式,但app描述中沒有添加這句話:「後臺定位對電池有損耗。。。」
c、廣告輪播圖中有Applewatch字樣
加急審覈技巧:當沒有嚴重bug時,能夠說集成的支付功能未作加密等處理,須要立刻更新。蘋果比較重視安全,極可能會經過審覈
2二、sskeychain知識點:
在iOS中每一個APP 都有屬於本身的Keychain,最經常使用就是保存用戶的帳戶和密碼,就是記住密碼,放在這裏很安全(蘋果負責幫咱們加密再存起來,若是出了問題怪他咯!),假如用NSUserDefault 保存這些祕密數據,生成的plist文件(就放在那個Library/Preferences 下)容易被拿到,並且還要本身作加密。
特性:1.當app刪除了,又再次從新安裝,這個保險櫃裏的信息還存在
2.安全!做爲小白的我並不知道它其實是存在哪裏的。
// 刪除之前保存的全部帳號和密碼 ,參數service服務名(這個方便對帳號密碼進行分類)
NSArray *accounts = [SSKeychain accountsForService:kSSToolkitMyPswdServiceName];
for (NSDictionary *dictionary in accounts) {
NSString *account = [dictionary objectForKey:@"acct"];
[SSKeychain deletePasswordForService:kSSToolkitMyPswdServiceName account:account];
}
2三、ios7系統異常(ios8以上不會出現)
a、定時器每秒調用一個方法,在方法內部用[btn setTitle: forState:]給按鈕設置一個不斷變化的標題,不會生效。採用btn.titleLabel.text = @"「解決
b、xib封裝視圖時,在視圖內部重寫layoutSubviews方法,裏面設置self.width和self.height的值會崩潰。解決方法:外部設置寬高,或內部別的地方設置寬高,若寬高等於屏幕寬高,且xib是豆腐塊類型時,不用設置,會自動匹配
c、xib中,對按鈕,使用控制面板屬性User Defined Runtime Attributes設置圓角、切割等,拷貝該按鈕到另外的xib中,程序崩潰。解決方法,刪除運行時設置(後面重現時又不出現了,緣由不明白。。。)
2四、APNs
a、ios8之前推送內容大小限制在256字節,以後提高到2k。2015年發佈新版APNs協議,提高到4k
b、舊版APNs:APNs不能保證分發消息的服務器(好比第三方SDK的服務器)socket維持鏈接,若是socket通道上沒有消息往來,socket會被路由器中斷。且服務器分發消息到APNs成功後沒有迴應,失敗後纔有error並關閉該socket,所以沒法知道服務器是否成功將消息分發到APNs。之前作聊天類APP,有用推送來作的,爲了知道消息是否發送成功,故意每10條消息後發送一條錯誤消息(如用錯的token),若是沒有迴應就代表已經中斷了socket連接,上面的10條消息就另外處理。
c、新版APNs:支持返回狀態碼,服務器發送消息到APNs成功返回200,失敗返回error。內容大小到4k。可經過心跳包檢測當前socket是否可用,並維持該連接。
d、目前存在問題:APNs向你推送4條消息,但你的設備網絡差,在APNs那裏下線了,這時你的設備的推送列表上有4個任務列表,合理狀況是當你的設備網絡好時所有推送給你,但APNs只會保留最後一條消息推送給你,並告訴你一共有4條消息,丟失了另外3條(緣由多是APNs的存儲-轉發能力不夠)。儘管這樣,APNs仍然沒法保證這4條消息必定能至少推送1條給你。倘若能收到一條,通常是詢問服務器看你有多少條未讀消息(技術手段多是用當前消息數組數量跟服務器返回的消息數作對比得知有多少條消息未收到)。如今的SDK能保證消息都推送到APNs(根據返回狀態碼,若推送失敗,重發),但APNs沒法保證推送到用戶。
2五、系統彈框和鍵盤的衝突
問題:鍵盤在屏幕上時,若彈出系統提示框如alertview,系統會自動退下鍵盤,拿到窗口來顯示alertview,若點擊alertView跳轉到另一個頁面,系統仍舊會還原鍵盤的初始狀態,使頁面出現一閃而過的鍵盤視圖,很難看。能夠先徹底退出鍵盤,在彈出系統提示框避免該問題。
2六、啓動廣告實現方式
a、實時下載圖片顯示,適用於圖片變化不是很頻繁的場景
b、先顯示上一次緩存的圖片,這一次將圖片從服務器獲取並緩存,以便下一次使用。
問題點:針對根控制器不固定的場景,在顯示廣告的時候獲取到須要加載的根控制器,保存,當廣告完畢後切換根控制器。當廣告過程當中點擊了圖片,則先切換根控制器,再push到廣告詳情頁面。
2七、appstore相關
a、構建版本時,蘋果使用的是項目中的build號做爲key,即不能上傳兩份build同樣的版本。但版本號version能夠相同
b、appstore下架後,只是將app從appstore的搜索列表中移除,讓別人搜索不到。只要取消下架,APP又會從新上架
c、加急審覈跟提交版本是兩個獨立的操做,經過appid關聯兩個操做。例子:對某個app進行加急後,取消該app的審覈狀態,從新打包上傳,即便版本號改變,依然是在加急狀態
2八、JPUSH若沒法推送成功,選擇開啓日誌輸出,好比日誌提示說證書緣由致使JPUSh沒法使用,剛好早些天蘋果我的帳號後臺這些證書有變更,從新生成證書,傳到JPUSH後臺即成功。注意,將證書刪除再從新生成新的證書上傳,不會影響線上版本的推送。
2九、友盟默認拿的是xcode中的bulid號做爲版本統計,而不是想固然的version號
30、對圖片不少的頁面,例如微信空間等,可採用顯示小圖片,當點擊圖片瀏覽時再下載大圖片。若直接使用大圖片,當有不少圖片時,會形成CPU使用率過高,好比藏家APP剛開始就使用的大圖,致使CPU很容易達到100%,iPhone4上很容易閃退。還有,從相冊拿出圖片是ALAsset類型的,當將其解壓轉換爲UIImage時會卡住主線程,須要注意。有一個跑馬燈視圖,因爲內部使用非法動畫形成循環調用,也就是動畫死循環一直執行,形成CPU超過100%(多核可能超過)發熱嚴重
3一、播放視頻用MPmovieplayercontroller或者AVPlayer,當網絡不佳緩衝時,都不知道什麼時候緩衝完畢(多是由於什麼時候緩衝完畢很差定義),我是採起隨機一個5-10s的數字,讓緩衝這個時間後再調用播放的方法。MPmovieplayercontroller當取消全屏時,通知MPMoviePlayerWillExitFullscreenNotification監聽不到,AVPlayer觀察者觀察不到playbackLikelyToKeepUp(緩衝足夠的BOOL屬性)的變化。
3二、UIPageControl,默認子視圖都是UIView類型,當用KVC設置了pageImage和currentPageImage屬性後,子視圖會變爲UIImageView類型。當設置UIPageControl的currentPage時,系統內部是先拿到對應的子視圖,再切換子視圖對應的圖片。通過驗證,有很小的可能,UIPageControl的子視圖仍然是UIView類型,這時候設置currentPage時,拿到的是UIView而且給它設置UIImage,引起崩潰。因此,若是須要設置系統UIPageControl樣式,最後自定義。而非用KVC
3三、極光推送,若要求針對某一個版本好比2.0.2作推送,能夠後臺作,前端作法是綁定tag或別名,可是sdk2.1.9以前是不支持特殊符號,好比.號的,因而採用去掉.號如202的綁定方式。
目標人羣設置是多選,能夠根據registeration id(具體手機的id),別名,tag等多重選擇選定人羣。
附加字段會設置到推送的字典裏面去,一個爲key一個爲value,在項目中對其進行處理
3四、其餘
NSURLRProtocol緩存web內容,監聽一切url請求(WKWebView除外)
layer.mask,塗層mask有妙用
CAShapeLayer配合UIBeriPath作動畫
柵欄化(大意是將要cell緩存成一張圖片顯示,提高表格性能,Core Animation書上有)
SDWebImage播放gif圖片時內存容易爆掉,缺陷在gif圖片拆分紅多張幀圖片時存儲在一個數組中,該數組致使內存變大。YYAnimationView(YYKit框架)不會這樣。思路大概是開啓CADisplayLink,不斷存儲下一幀須要播放的圖片並清除掉已經播放完畢的圖片。SDWebImage和YYWebImage爲了性能優化,都是緩存的圖片數據解壓後的data,此對大圖片容易形成內存爆炸,有個屬性能夠禁用圖片解壓操做,或者能夠限制內存緩存,或者限制內存緩存大小等。。。
內存泄漏:block,delegate沒用weak,C、CF語言框架,工具類方法傳入了控制器的view,而方法內部強引用了控制器(注意保證工具類方法view屬性爲weak便可),。 通常會在控制器銷燬時觀察dealloc方法判斷是否有內存泄漏。能夠考慮作個簡易框架,原理:監測導航欄的pop方法,該方法內部延後一段時間(好比2s),斷言該控制器爲nil,不然未銷燬程序被打斷
cookies和session,前者客戶端,會增大http頭的大小,保存少許信息,如瀏覽器帳號密碼等,安全等級低。後者服務端,可是須要客戶端配合保存sessionId,安全等級高。這兩個東西大致是相同的,做用:增長網絡訪問速度。好比app加載一個web頁面,非首次加載明顯變快
本地緩存如何在服務器內容修改後及時更新?Last-Modified 或者 Etag,標示服務器內容是否更改,未更改則返回特定狀態碼而非數據,不然直接返回數據。由於請求等冪等緣由,POST請求沒法被緩存。
數字簽名原理詳解:http://blog.jobbole.com/107930/
http請求頭中KeepAlive的做用就是在第一次建立鏈接時,服務器會把這個tcp鏈接保持一段時間(服務器端會有一個keepaliveTime的最大時間,超過期間就斷開鏈接)。缺點,長連接消耗服務端內存
網絡請求DNS解析緩存,配置HOST文件繞過DNS解析,網關。。。
FMDB時,數據庫嵌套操做會致使死鎖。
tableView中cell上有個文本框,文本框內容變化時調用tableView的reloadData會致使鍵盤自動消失。此時可用beginUpdates和endUpdates替代刷新操做
CAAnimation的delegate屬性是strong,緣由
一、動畫是異步的,動畫完成後動畫線程銷燬,delegate屬性清空,不會產生內存泄露
二、若不用strong,則若動畫過程當中控制器銷燬,而動畫代理方法中引用了控制器,程序可能崩潰
儘可能不要設置removedOnCompletion = false ,這樣動畫完成後代理並不會被清空,配合CAAnimationDelegate會帶來循環運用的問題,若是須要動畫停留在最後的狀態,能夠直接設置View的center屬性在動畫結束的位置Point
線程間通訊:
一、基於端口的輸入源: NSPort 的方法- (BOOL)sendBeforeDate:(NSDate *)limitDate msgid:(NSUInteger)msgID components:(nullable NSMutableArray *)components from:(nullable NSPort *)receivePort reserved:(NSUInteger)headerSpaceReserved;
二、[self performSelector:<#(nonnull SEL)#> onThread:<#(nonnull NSThread *)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>],缺點是執行線程方法時若線程已經銷燬,則崩潰
三、自定義輸入源:使用CGRunLoopSourceRef
相關詳細文章地址:http://www.jianshu.com/p/4d5b6fc33519
3八、 輸入中文時限制字符長度
- (void)textViewDidChange:(UITextView *)textView{
NSString *toBeString = textView.text;
NSString *language = textView.textInputMode.primaryLanguage;
if ([language isEqualToString:@"zh-Hans"]) {
UITextRange *selectedRange = textView.markedTextRange;
// selectedRange爲空,說明拼音已經轉換爲中文
if (!selectedRange && toBeString.length > 5) {
textView.text = [toBeString substringToIndex:5];
}
}else if(toBeString.length > 5){
textView.text = [toBeString substringToIndex:5];
}
}
39.Array 的深複製
指針的複製
dataArray3=[dataArray2 mutableCopy];
知識對dataArray2 進行了深複製,數組中的內容僅僅是指針的複製。
單層深複製
dataArray3=[[NSMutableArray alloc]initWithArray:dataArray2 copyItems:YES];
dataArray2進行自己和內容的深複製。單僅僅是內容的第一層
徹底深複製
dataArray3 = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:dataArray2]];
無論多少層均可以進行了深複製
40.MLeaksFinder 檢查內存泄露
41.有些偶爾會出現的bug緣由猜想
a、有些代碼是有執行順序的,而網絡請求返回時間不定致使
b、線程問題。如多線程異步隊列任務執行結果順序不必定致使
c、dispatch_group_t因爲請求可能的失敗致使的組進出次數不一致致使崩潰
d、服務器線程問題。好比同時日程重構,同時發送兩個請求,可是服務器最終訪問的是一個方法,線程錯亂致使回調結果反了
42.fmdb優化
精簡sql語句,好比表的鏈接操做,小的表放到左邊,總之讓過濾條件先過濾掉儘量多的數據
fmdb默認緩存是關閉的,開啓
默認執行一條sql開啓關閉一次事物。批量操做時,手動開啓事物,不少sql執行完畢再提交或回滾事物
fmdb存儲數組對象。能夠一張表,則數組對象歸檔成nsdata,對象之間用逗號分開,把數組對象當成字符串存儲
coredata,有一種自定義存儲類型Transformable,能夠存儲數組,也是利用歸檔原理
也能夠兩張表存儲,可是那樣管理麻煩