| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- //
- // RMRefHistoryTableViewController.m
- // HeapInspectorExample
- //
- // Created by Christian Menschel on 11.09.14.
- // Copyright (c) 2014 tapwork. All rights reserved.
- //
- #import "HINSPRefHistoryTableViewController.h"
- #import "NSObject+HeapInspector.h"
- #import "HINSPTableViewCell.h"
- #import "HINSPTableViewController.h"
- @interface HINSPRefHistoryTableViewController ()
- @end
- @implementation HINSPRefHistoryTableViewController
- #pragma mark - Init
- - (instancetype)initWithObject:(id)object
- {
- self = [super initWithObject:object];
- if (self) {
-
- self.title = [NSString stringWithFormat:@"%s: %p",
- object_getClassName(self.inspectingObject),
- self.inspectingObject];
-
- NSArray *dataSource = [NSObject referenceHistoryForObject:object];
- self.dataSource = dataSource;
- }
- return self;
- }
- #pragma mark - View Life Cycle
- static const CGFloat kHeaderViewHeight = 70;
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- UIView *headerView = [[UIView alloc] init];
- headerView.frame = CGRectMake(0, 0, self.view.bounds.size.width, kHeaderViewHeight);
- headerView.backgroundColor = [UIColor colorWithWhite:0.95 alpha:1.0];
- headerView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
- UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,8,headerView.bounds.size.width,20.0)];
- label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
- label.font = [UIFont systemFontOfSize:10];
- label.numberOfLines = 1;
- label.textAlignment = NSTextAlignmentCenter;
- NSInteger retainCount = CFGetRetainCount((__bridge CFTypeRef)self.inspectingObject);
- label.text = [NSString stringWithFormat:@"Retain Count: %ld ", (long)retainCount];
- [headerView addSubview:label];
-
- UIView *superTableHeaderView = self.tableView.tableHeaderView;
- self.tableView.tableHeaderView = nil;
- CGRect tableHeaderViewFrame = superTableHeaderView.frame;
- tableHeaderViewFrame.origin.y = CGRectGetMaxY(label.frame);
- superTableHeaderView.frame = tableHeaderViewFrame;
- [headerView addSubview:superTableHeaderView];
- self.tableView.tableHeaderView = headerView;
- }
- #pragma mark - TableView
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- HINSPTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kTableViewCellIdent
- forIndexPath:indexPath];
-
- NSDictionary *item = self.dataSource[indexPath.row];
- cell.textLabel.text = [NSString stringWithFormat:@"%ld %@",(long)indexPath.row, item[@"type"]];
- NSString *symbol = [NSObject symbolForPointerValue:item[@"last_frame"]];
- cell.detailTextLabel.text = symbol;
-
- NSArray *backtrace = item[@"all_frames"];
- if ([backtrace count] > 0) {
- cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
- cell.userInteractionEnabled = YES;
- } else {
- cell.accessoryType = UITableViewCellAccessoryNone;
- cell.userInteractionEnabled = NO;
- }
-
- return cell;
- }
- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
- {
- NSDictionary *item = self.dataSource[indexPath.row];
- NSArray *backtraceSymbols = [self symbolsFromPointers:item[@"all_frames"]];
- if ([backtraceSymbols count] > 0) {
- HINSPTableViewController *detailVC = [[HINSPTableViewController alloc] initWithDataSource:backtraceSymbols];
- detailVC.title = [NSString stringWithFormat:@"%@'s backtrace",item[@"type"]];
- [self.navigationController pushViewController:detailVC animated:YES];
- }
-
- [tableView deselectRowAtIndexPath:indexPath animated:NO];
- }
- #pragma mark - Search
- - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
- {
- NSMutableArray *dataSource = [self.dataSourceUnfiltered mutableCopy];
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
- NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type contains[cd] %@ OR last_frame contains[cd] %@",
- searchText,searchText];
- [dataSource filterUsingPredicate:predicate];
- dispatch_async(dispatch_get_main_queue(), ^{
- self.dataSource = dataSource;
- [self.tableView reloadData];
- });
- });
- }
- #pragma mark - Helper
- - (NSArray *)symbolsFromPointers:(NSArray *)pointers
- {
- NSMutableArray *symbols = [NSMutableArray array];
- for (NSValue *pointerValue in pointers) {
- NSString *symbol = [NSObject symbolForPointerValue:pointerValue];
- [symbols addObject:symbol];
- }
- return symbols;
- }
- @end
|