跳到主要內容

發表文章

目前顯示的是 2018的文章

[iOs] SDWebImage 下載後 圖片上下留白

contentMode 設AspectFit 寬比高長 [ self . picImageView sd_setImageWithURL :[ NSURL URLWithString :url] placeholderImage :[ UIImage imageNamed : @"pic_offer_n" ] completed :^( UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {                          double width = image. size . width ;             double height = image. size . height ;             double apect = width/height;             double imageViewWidth = weakSelf. picImageView . frame . size . width ;             double nHeight = imageViewWidth /  apect;             [weakSelf. picImageView . heightAnchor constraintEqualToConstant :nHeight]. active = YES ;                      }]; 設定 height 的constraint,重設height

[Android] 指紋辨識

Android 官方文件 https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager https://developer.android.com/reference/android/hardware/biometrics/BiometricPrompt Demo https://www.jianshu.com/p/1eae12582a31 https://tpu.thinkpower.com.tw/tpu/File/html/201712/20171219171112_f.html?f=3dj6j8kd38895ksgtdddd93865jhr9sn3rqkh https://xnfood.com.tw/android-fingerprintmanager-api/

iOS 性能優化

source: https://juejin.im/post/5b7a9c466fb9a019eb43b0d5 卡頓優化 -CPU  盡量用輕量級的對象,比如用不到事件處理的地方,可以考慮使用CALayer取代UIView 不要頻繁地調用UIView的相關屬性,比如frame、bounds、transform等屬性,盡量減少不必要的修改  盡量提前計算好佈局,在有需要時一次性調整對應的屬性,不要多次修改屬性  Autolayout會比直接設置frame消耗更多的CPU資源  圖片的size最好剛好跟UIImageView的size保持一致  控制一下線程的最大並發數量  盡量把耗時的操作放到子線程 卡頓優化 -GPU  盡量避免短時間內大量圖片的顯示,盡可能將多張圖片合成一張進行顯示  盡量減少視圖數量和層次  減少透明的視圖(alpha<1 li="" nbsp="" opaque=""> 盡量避免出現離屏渲染 離屏渲染  在OpenGL中,GPU有2種渲染方式  On-Screen Rendering:當前屏幕渲染,在當前用於顯示的屏幕緩衝區進行渲染操作  Off-Screen Rendering:離屏渲染,在當前屏幕緩衝區以外新開闢一個緩衝區進行渲染操作  離屏渲染消耗性能的原因  需要創建新的緩衝區  離屏渲染的整個過程,需要多次切換上下文環境,先是從當前屏幕(On-Screen)切換到離屏(Off-Screen);等到離屏渲染結束以後,將離屏緩衝區的渲染結果顯示到屏幕上,又需要將上下文環境從離屏切換到當前屏幕  哪些操作會觸發離屏渲染?  光柵化,layer.shouldRasterize = YES  遮罩,layer.mask  圓角,同時設置layer.masksToBounds = YES、layer.cornerRadius大於0 考慮通過CoreGraphics繪製裁剪圓角,或者叫美工提供圓角圖片  陰影,layer.shadowXXX 如果設置了layer.shadowPath就不會產生離屏渲染 優化方案  一、dyld 減少動態庫、合併一些動態庫(定期清理不必要的動態庫) 

優化記憶體管理

使用ARC 延遲加載懶加載 重用在正確的地方使用reuseIndentifier 緩存NSCache 保存計算數據 處理內存警告移除對緩存,圖片object 和其他一些可以重創建的objects 的強引用 5.1 app delegate 中使用`applicationDidReceiveMemoryWarning:` 的方法 5.2 自定義UIViewController 的子類(subclass)中覆蓋`didReceiveMemoryWarning` 5.3在自定義類中註冊並接收UIApplicationDidReceiveMemoryWarningNotification 的通知 重用大開銷對象NSDateFormatter和NSCalendar 懶加載/單例_formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy”; 設置和創建速度一樣慢 自動釋放池手動添加自動釋放池 是否緩存圖片imageNamed imageWithContentOfFile 混編 循環引用delegate block nstimer 移除kvo nsnotificationcenter 並未強引用,只記錄內存地址,野指針報 UIViewController自動移除一般在dealloc中 performselector 延遲操作[NSObject cancelPreviousPerformRequestsWithTarget:self]

memory leak

1.打印殭屍對象,進行野指針的檢測   2.靜態檢測方法product->Analyze   3.動態檢測方法Build Setting -> Analyze During ‘Build’ ->Yes   4.xcode自帶工具instruments  5.dealloc 打印測試是否運行  6.第三方內存檢測工具 如:mleak

Block and copy

block也經常使用 copy 關鍵字,具體原因見官方文檔:Objects Use Properties to Keep Track of Blocks: block使用copy 是從MRC 遺留下來的“傳統”,在MRC 中,方法內部的block是在棧區的,使用copy 可以把它放到堆區.在ARC 中寫不寫都行:對於block使用copy還是strong 效果是一樣的,但寫上copy 也無傷大雅,還能時刻提醒我們:編譯器自動對block 進行了copy 操作。 如果不寫 copy ,該類的調用者有可能會忘記或者根本不知道“編譯器會自動對block進行了 copy 操作”,他們有可能會在調用之前自行拷貝屬性值。這種操作多餘而低效。

Objective-C extern

extern  下面的代碼聲明了一個全局變量,它用於告訴編譯器:“你現在編譯的文件中,有一個標識符雖然沒有在本文件中定義,但是它是在別的文件中定義的全局變量,你要在其它文件內查找!” #define ANIMATION_DURATION 0.5 // 替换成 static const NSTimeInterval kAnimationDuration = 0.5; // 全局常量 // QiShare.h extern const NSTimeInterval QiShareAnimationDuration; // QiShare.m const NSTimeInterval QiShareAnimationDuration = 0.3;

Print log in swift

Swift has  #file ,  #function ,  #line  and  #column . From  Swift Programming Language : #file  - String - The name of the file in which it appears. #line  - Int - The line number on which it appears. #column  - Int - The column number in which it begins. #function  - String - The name of the declaration in which it appears. 下log用。

View-Related Notifications in ViewController

A viewcontroller push b viewController B loadView() B viewDidLoad() A viewWillDisappear B viewWillAppear B viewWillLayoutSubviews() B viewDidLayoutSubviews() A viewDidDisappear B viewDidAppear B vc back to A vc B viewWillDisappear A viewWillAppear B viewDidDisappear A viewDidAppear 從來沒認真過這個順序,考過之後,才發現跟認知有點距離。我應該也背不下來。XD