亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

FBMemoryProfiler使用

2019-11-06 09:42:40
字體:
來源:轉載
供稿:網友

原文地址:http://ifujun.com/fbmemoryPRofiler-shi-yong-ji-chu-jiao-cheng/

FBMemoryProfiler是Facebook開源的一款用于分析iOS內存使用和檢測循環引用的工具庫。

在上一篇[譯文]在iOS上自動檢測內存泄露中,Facebook講解了FBMemoryProfiler的核心原理。鑒于有人在評論里問怎么使用,我這里就簡單介紹一下。

安裝

CocoaPods

建議使用Cocoapods安裝,只需要在pod文件中,添加這么一句就行:

pod 'FBMemoryProfiler'

FBMemoryProfiler最低支持iOS8,所以如果你的pod文件上最低要求是6或者7的話,是無法直接安裝的。所以,建議在開發分支或者如果你有多個target的話,在開發的target上添加FBMemoryProfiler,在生產的target上不需要添加FBMemoryProfiler。

我一般習慣于有兩個target,一個用于開發,里面可能會包含Reveal、蒲公英等的庫,而這在生產包中是不必要的,另一個用于生產,只用于打生產包。

所以我的pod文件可能是這樣的:

# Uncomment this line to define a global platform for your projectplatform :ios, '8.0'# Uncomment this line if you're using Swift# use_frameworks!target 'FBMemoryProfilerTest' doendtarget 'FBMemoryProfilerTest_Dev' dopod 'FBMemoryProfiler'end

安裝成功之后,打開對于的.xcworkspace文件即可。

Carthage

如果你的app從iOS8開始支持的話,你可以使用Carthage來安裝。

在創建的Cartfile文件中添加:

github "facebook/FBMemoryProfiler"

之后,運行carthage update --configuration Debug即可。

因為我的app要從iOS6開始支持,所以我沒有使用這個。

嵌入代碼

首先,要在main.m中添加FBRetainCycleDetector的hook,同時,也要開啟FBAllocationTracker的生成追蹤:

#import <UIKit/UIKit.h>#import "AppDelegate.h"#if DEBUG#import <FBAllocationTracker/FBAllocationTrackerManager.h>#import <FBRetainCycleDetector/FBRetainCycleDetector.h>#endifint main(int argc, char * argv[]) {    @autoreleasepool {#if DEBUG        [FBAssociationManager hook];        [[FBAllocationTrackerManager sharedManager] startTrackingAllocations];        [[FBAllocationTrackerManager sharedManager] enableGenerations];#endif        return UIapplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));    }}

我習慣于添加一個DEBUG標識符,只在Debug狀態才開啟FBMemoryProfiler。當然,你可以不需要。

之后,我們要在AppDelegate.mapplication: didFinishLaunchingWithOptions:中嵌入FBMemoryProfiler的創建代碼:

#if DEBUG#import <FBMemoryProfiler/FBMemoryProfiler.h>#import <FBRetainCycleDetector/FBRetainCycleDetector.h>#import "CacheCleanerPlugin.h"#import "RetainCycleLoggerPlugin.h"#endif@interface AppDelegate (){#if DEBUG    FBMemoryProfiler *memoryProfiler;#endif}@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {#if DEBUG    memoryProfiler = [[FBMemoryProfiler alloc] initWithPlugins:@[[CacheCleanerPlugin new],                                                                  [RetainCycleLoggerPlugin new]]                              retainCycleDetectorConfiguration:nil];    [memoryProfiler enable];#endif    return YES;}@end

其中,插件是可以不開啟的,如果你不想開啟的話,你可以這么寫:

FBMemoryProfiler *memoryProfiler = [FBMemoryProfiler new];[memoryProfiler enable];

插件主要是用來進行過濾、去重或者輸出、存儲等操作的,畢竟如果不開啟插件的話,只能通過在手機、模擬器上點擊屏幕來看內存泄露,而如果自定義log插件的話,可以將捕獲到的內存泄露輸出到控制臺或者文件中。

比如說,我們可以自定義一個RetainCycleLoggerPlugin,使用FBMemoryProfilerPluggable協議,重寫memoryProfilerDidFindRetainCycles:方法:

- (void)memoryProfilerDidFindRetainCycles:(NSSet *)retainCycles{    if (retainCycles.count > 0)    {        NSLog(@"/nretainCycles = /n%@", retainCycles);    }}

FBRetainCycleDetector找到循環引用之后,就會調用到上面的方法,但是,retainCycles可能是個空集合,所以這里可以過濾一下。

我在測試我的app的時候,發現這樣一個問題:

我確信這里沒有因為我而導致的循環引用,但是FBRetainCycleDetector在這里檢測到了這個環,這里的主要問題在于_subviewCache,這是蘋果的機制,但是并不會造成內存泄露。對于這種情況,我們需要將它過濾出去。

除此之外,還有一個Timer的問題,因為一般情況下,Timer會強引用target,所以可能導致內存泄露,如果你確信沒有問題的話,可以關閉對Timer的檢測。

過濾代碼類似于這種:

NSArray *filters = @[FBFilterBlockWithObjectIvarRelation([UIView class], @"_subviewCache")];FBObjectGraphConfiguration *configuration =[[FBObjectGraphConfiguration alloc] initWithFilterBlocks:filters                                     shouldInspectTimers:YES];memoryProfiler = [[FBMemoryProfiler alloc] initWithPlugins:@[[CacheCleanerPlugin new],                                                                  [RetainCycleLoggerPlugin new]]                               retainCycleDetectorConfiguration:configuration];[memoryProfiler enable];

我們只需要設置一個過濾數組,然后添加到FBMemoryProfilerConfiguration中即可。

對于你確信沒有問題或者不想修改的問題,你可以在Configuration中直接過濾掉。

比如:

NSArray *filters = @[FBFilterBlockWithObjectIvarRelation([UipanGestureRecognizer class], @"_internalActiveTouches")];

如果你有CI的需要,你可以在代理中輸出log到文本,之后傳出到服務器上。

運行

具體操作可以參考Facebook的視頻,上一篇譯文中也有給出。


上一篇:沉浸式模式


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产99久久久久久| 精品小视频在线| 日韩在线观看免费高清完整版| 在线观看国产欧美| 久久国产精品网站| 国产成人精品国内自产拍免费看| 高清一区二区三区日本久| 亚洲一区二区三区sesese| 欧美另类xxx| 欧美xxxwww| 成人av.网址在线网站| 成人免费看黄网站| 日韩的一区二区| 国产精品久久久久久久久久尿| 国产精品678| 欧美丝袜一区二区| 亚洲视频视频在线| 亚洲综合中文字幕在线观看| 日韩精品视频在线观看免费| 亚洲国产精品va在线看黑人| 亚洲第一男人天堂| 亚洲理论在线a中文字幕| 久久亚洲国产精品| 91精品国产成人| 欧美视频在线免费看| 日韩中文字幕网| 欧美噜噜久久久xxx| 精品久久久久久久久久久久| 日韩亚洲欧美成人| 欧美一级淫片aaaaaaa视频| 日韩精品极品在线观看播放免费视频| 日本一区二区三区在线播放| 久久久在线观看| 国产精品激情自拍| 午夜精品久久久久久久99黑人| 伊人久久久久久久久久久| 国产亚洲精品日韩| 青青草国产精品一区二区| 91精品久久久久| 91丝袜美腿美女视频网站| 日韩大陆欧美高清视频区| 日韩精品久久久久久久玫瑰园| 永久免费毛片在线播放不卡| 欧美亚洲视频在线看网址| 亚洲色图欧美制服丝袜另类第一页| 久久成人精品视频| 亚洲香蕉伊综合在人在线视看| 97国产成人精品视频| 国产成人91久久精品| 黑人巨大精品欧美一区二区三区| 一本色道久久综合狠狠躁篇的优点| 亚洲午夜小视频| 2019中文字幕全在线观看| 亚洲色图第三页| 91精品国产91久久久久久不卡| 色视频www在线播放国产成人| 国产一级揄自揄精品视频| 欧美成人精品在线播放| 欧美激情一区二区三区在线视频观看| 亚洲精品影视在线观看| 日日狠狠久久偷偷四色综合免费| 88国产精品欧美一区二区三区| 久久精品国产69国产精品亚洲| 亚洲欧洲中文天堂| 国产精品久久久久久久久借妻| 亚洲网站在线观看| 91精品国产高清久久久久久91| 韩国三级电影久久久久久| 日韩中文字幕在线播放| 成人淫片在线看| 国产美女精品视频免费观看| 久久91精品国产91久久跳| 色综久久综合桃花网| 日本精品在线视频| 91精品免费看| 国产精品美女999| 日韩欧美国产一区二区| 美日韩丰满少妇在线观看| 成人精品视频在线| 久久久91精品国产一区不卡| 一本色道久久88精品综合| 亚洲欧美日韩国产精品| 国产91网红主播在线观看| 91精品国产91久久久久久最新| 亚洲精品视频在线观看视频| 国产精品久久久久久久久免费| 亚洲性av在线| 欧美激情在线播放| 国产精品444| 久久久久久国产| 国产一区香蕉久久| 国色天香2019中文字幕在线观看| 亚洲自拍偷拍福利| 日韩视频中文字幕| 欧美激情欧美激情| 97免费视频在线播放| 亚洲a在线播放| 精品久久久久久国产91| 亚洲第一视频网站| 日韩在线观看免费全集电视剧网站| 久久久久久久成人| 久久久久亚洲精品国产| 亚洲韩国欧洲国产日产av| 黑人巨大精品欧美一区二区三区| 久久久伊人欧美| 欧美噜噜久久久xxx| 岛国视频午夜一区免费在线观看| 欧美激情图片区| 国产精品18久久久久久麻辣| 亚洲成人a级网| 中文字幕亚洲欧美在线| 久久在线免费视频| 精品少妇v888av| 国产精品久久久久影院日本| 中文字幕亚洲字幕| 色婷婷综合成人av| 欧美亚洲激情在线| 日韩美女在线观看一区| 国产欧美日韩亚洲精品| 日韩中文字幕免费| 欧美成人在线免费| 欧美日韩成人网| 欧美激情精品久久久久久蜜臀| 成人激情视频小说免费下载| 日韩免费在线免费观看| 亚洲精品美女视频| 国产成人精品在线| 国产精品一区二区三区免费视频| 欧美日韩国产综合新一区| 国产69精品久久久久9999| 日韩电影视频免费| 日本视频久久久| 全色精品综合影院| 亚洲欧美一区二区精品久久久| 清纯唯美日韩制服另类| 欧美在线免费观看| 久久九九精品99国产精品| 国产精品一区二区三区久久久| 日韩精品视频免费在线观看| 欧美精品在线免费播放| 国产综合久久久久久| 91精品久久久久久久久不口人| 国产精品普通话| 亚洲区中文字幕| 亚洲一区久久久| 欧美另类老肥妇| 国产美女主播一区| 国产精品成人va在线观看| 国产在线观看91精品一区| 美日韩丰满少妇在线观看| 深夜成人在线观看| 国产丝袜一区二区三区| 欧美视频中文在线看| 国产suv精品一区二区| 欧美一级大胆视频| 欧美成人激情图片网| 久久久久国产精品一区| 国产精品成人va在线观看| 久久久久99精品久久久久| 国产91成人在在线播放| 久久人人爽人人| 性色av一区二区三区红粉影视| 红桃av永久久久| 欧美日韩性视频|