iOS入门之调试(程序运行流程、程序生命周期、VC生命周期、调试)

目录

1. 程序运行流程、生命周期
2. 调试方法
  NSLog
  断点
    普通断点
    全局断点
    条件断点
  命令行
    po
  NSAssert
  布局问题---设置背景色、

1. 程序运行流程、生命周期

知道程序的运行流程可以快速找到出错的地方。

  1. main.m

main函数是整个程序的入口(点击应用图标,程序启动后会调用所有类、分类的+load方法,然后调用main方法)
-》初始化了一个UIApplication应用单例对象,并设置delegate为AppDelegate。UIApplication让AppDelegate代理自己去做具体实现(这样可以防止直接去修改UIApplication,更安全)。

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
    @autoreleasepool {
        // 第三个参数nil 等价于 NSStringFromClass([UIApplication class])
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
} 
  1. 生命周期

App生命周期

程序启动:X->A—>E
Home:             —>B—>C
再回来:                 —>D—>E
退出:                         —>B—>C—>F

// X
main函数:初始化UIApplication对象,并设置dele为AppDelegate

// @property (nonatomic,strong) UIWindow *window;
// A:应用加载完毕后调用(只被调用一次)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{  // 如果点击通知启动的APP,launtionOptions会包含通知信息
    // 1.初始化窗口,设置根视图
    self.window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    self.window.rootViewController=[self rootVC];
    self.window.backgroundColor=[UIColor whiteColor];
    [self.window makeKeyAndVisible];
    
    // 2.初始化第三方或其他配置
    [self setup];

    return YES;
}
// B:应用即将从前台到后台(用于:游戏降低帧率、暂停游戏)
// 比如来电话了,此时会调用applicationWillResignActive
// 将要进入非活跃状态执行。在此期间,应用程序不接收消息或事件。
- (void)applicationWillResignActive:(UIApplication *)application {
}
// C:应用进入后台后调用(用于:保存状态数据、销毁定时器)
// 应用被挂起,内存紧张时会销毁应用
- (void)applicationDidEnterBackground:(UIApplication *)application {
}
// D:应用即将进入前台时调用(用于:恢复之前保存的状态数据)
- (void)applicationWillEnterForeground:(UIApplication *)application {
}
// E:应用进入前台后调用(处于活跃状态)
// 进入活动状态执行。在此期间,应用程序可接收消息或事件。
- (void)applicationDidBecomeActive:(UIApplication *)application {
}
// 内存紧张时调用,在这里清除内存可以避免应用被销毁
-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application{
}
// F:(由于内存紧张)应用销毁前调用(用于一些收尾工作)
- (void)applicationWillTerminate:(UIApplication *)application{
}

VC生命周期

进入页面:(H->)L->A->B->D->D1->B1
离开页面:       ->C->C1
返回页面:           ->B->B1
退出页面:               ->C->C1
其他页面使用了vc.view :H->L->A

/*
H

调用[vc new] 或 [[vc alloc]init] 或[[UIViewController alloc]initWithNibName:@"Xib" bundle:nil]时
加载nib会调用每一个对象的awakeFromNib方法
*/
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    //
    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}
/*
H

当通过StoryBoard的segue跳转或调用[[UIStoryboard storyboardWithName:@"Main" bundle:nil]instantiateViewControllerWithIdentifier:@""]时调用
*/
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    return [super initWithCoder:aDecoder];
}

// L:可选择性覆写-自定义self.view(一般不使用)
// -------- 用于重写Controller的根视图 --------
-(void)loadView{
    // 当controller的view为nil时(第一次被显示时或在其他控制器中第一次用到时),会调用loadView方法加载Controller的根视图
    // 会从xib、storyboard中查找并赋值给self.view,没有找到时会创建一个空的View并赋值给self.view
    [super loadView];
    // 没有xib、storyboard时可覆写该方法创建View,此时不必调用[super loadView] ,可以减少不必要的开销。
    // 当没有覆写loadView方法时,会调用默认的loadView方法(会从xib、storyboard中查找,没有找到时会创建一个空的View
}
// A:页面加载完毕后调用
/*
只有在视图控制器将其视图载入到内存之后调用该方法。
*/
-(void)viewDidLoad{
    [super viewDidLoad];
}
// B:页面即将显示在屏幕上时调用
/*
当视图将要添加到窗口中并且还不可见的时候或者上层视图移出图层后本视图变成顶级视图时调用该方法,用于执行诸如改变视图方向等的操作。实现该方法时确保调用[super viewWillAppear:animated];
*/
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
}
// B1:页面完全显示在屏幕上后调用
/*
当视图添加到窗口中以后或者上层视图移出图层后本视图变成顶级视图时调用,用于放置那些需要在视图显示后执行的代码。确保调用 [super viewDidAppear:animated];
*/
-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
}

// C:页面即将消失时调用
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
}
// C1:页面完全消失后调用
-(void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];   
}
// D:内存紧张时调用
-(void)didReceiveMemoryWarning{
}
// F:销毁
-(void)dealloc{
    // 销毁计时器
    // 移除观察者
}

/*
被调用的3种情况

    // 1. 强制刷新布局后调用
    [self.view setNeedsLayout];
    [self.view layoutIfNeeded];

    // 2. 布局发生改变后调用。

    // 3. 第一次进入页面,viewWillAppear后调用一次
*/
// D
-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
}
// D1
-(void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
}

// 当vc'view的大小发生变化时,或发生旋转时调用
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
从A页push到B页
[
  1. A viewDidLoad  
  2. A viewWillAppear  
  3. A viewDidAppear  
]
  4. B viewDidLoad  
  5. A viewWillDisappear  
  6. B viewWillAppear  
  7. A viewDidDisappear  
  8. B viewDidAppear  

从B页pop会A页
  1. B viewWillDisappear  
  2. A viewWillAppear  
  3. B viewDidDisappear  
  4. A viewDidAppear  

View生命周期

纯代码  [[UIView alloc]init]  、 [UIView new]
    initWithFrame
    init
    layoutSubviews

纯代码  [[UIView alloc]initWithFrame:CGRectZero]
    initWithFrame
    layoutSubviews

xib  [[[NSBundle mainBundle]loadNibNamed:@"View" owner:nil options:nil]lastObject]
    initWithCoder
    awakeFromNib
    layoutSubviews

2. 调试方法

  1. NSLog
    #define NSLog(format, ...) printf("\n[%s] %s [第%d行] %s\n", __TIME__, __FUNCTION__, __LINE__, [[NSString stringWithFormat:format, ## __VA_ARGS__] UTF8String]);

    // 打印
    NSLog(@"%d",30);
  1. 断点

普通断点


在代码行左侧单击(快捷键:cmd+| )

全局断点


全局断点

条件断点
条件断点(右击断点)
  1. 命令行

po 参数名


命令行: po 参数名

bt 调用的函数栈

其他命令

查看命令帮助
     help 命令
     help 命令 子命令 子子命令
     // 例
     help break   。  help break command   。  help break command add

断点
     breakpoint可简写为b
     
     获取本文件所有断点
     breakpoint list
     
     删除具体断点(2是上述命令查到的 断点序号)
     breakpoint delete 2
     删除所有断点
     breakpoint delete

     打断点(指定内存地址)
     breakpoint 0x000086bc
     
     打断点(指定方法名)
     breakpoint set --name setupUI
     等价
     breakpoint set -n setupUI
     breakpoint set -n "-[VC setupUI]"
     br s -n "-[VC setupUI]"
     
     打断点(指定多个方法名)
     breakpoint set --name setupUI --name setupNavBar
     
     打断点(指定某文件行数--不会在XCode上显示)
     breakpoint set --file VC1.m --line 26
     等价
     breakpoint set -f VC1.m -l 26
     
     打断点(指定C方法,不对OC同名方法打断点)
     breakpoint set --method setupUI
     等价
     breakpoint set -M setupUI
     
     打断点(指定OC方法,不对C同名方法打断点)
     breakpoint set --selector setupUI
     等价
     breakpoint set -S setupUI
     
     打断点(动态库中的方法名)
     breakpoint set --shlib x.dylib --name setupUI
     等价
     breakpoint set -s x.dylib -n setupUI
     
    打印追踪轨迹
    breakpoint command add 2
     
    breakpoint set -r setupUI


别名
     为命令设置别名,使用:bfl VC.m 12
     command alias bfl breakpoint set -f %1 -l %2
     撤销别名命令
     command unalias bfl
     watchpoint
     查看所有watchpoint   -b简略 -f全面 -v完整
     watchpoint list
    
     某变量值的改变 后触发
     watchpoint set variable a
     某变量值等于某固定值 后触发
     watchpoint modify -c '(a=100)'
     查看值改变成100的地址
     c
    
     追踪程序的运行过程
     bt
    
     查看变量值
     frame variable a
    
     查看当前进程的状态
     thread list
    
     thread step-in
     step-inst    step-inst-over     step-out     step-over
  1. NSAssert 断言
    // true则继续,false则异常
    NSAssert(contentStr!=nil, @"Argument must be non-nil");    
  1. 布局有问题时
=>设置背景颜色
=>点击调试框上的层级按钮(三矩形)
三矩形
  1. 快速找到需修改的控件位置
方式1、cmd+4 搜索关键字
方式2、点击调试框上的层级按钮(三矩形),再点击控件,右上查看控件名。点击箭头跳到具体位置。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335