iOS 基础01--项目文件、applecation、启动过程、VC生命周期

iOS 基础01--项目文件、applecation、启动过程、VC生命周期

1 项目中常见的文件

  • 1 info.plist 文件
    plist文件是一个全局配置文件,系统默认就叫做info.plist,所以如果自己取名字千万不可以取作info.plist;
    代码里拿到info.plist里的参数使用
[[NSBundle mainBundle]infoDictionary]; //这个字典拿到的就是info.plist里的东西,比如获取版本号
NSString * versionStr = [[[NSBundle mainBundle]infoDictionary] objectForKey:@"CFBundleShortVersionString"];

另一个需要注意的是info.plist里的Bundle name就是我们手机桌面上显示的app名字,系统默认的是取product name

  • 2 .pch 文件
    这是一个全局配置文件,是需要自己手动创建的。在创建new file的最下面的other下有一个 pch file。生成完成之后,同样需要自己配置一下。在build setting 里搜 prefix header,把刚才自己新建的文件名的路径拖进去。

  • 3 OC宏
    这里说的宏就是大概要用在PCH文件里面的使用到,自己以前没见过的:

#ifdef __OBJC__ //OC文件中使用
 #ifdef DEBUG //在debug条件下执行
 #define FCFLog(...) NSLog(__VA_ARGS__) //自定义的打印函数
 #else
 #define FCFLog(...) //NSLog(__VA_ARGS__)
 #endif
#endif
  • 4 这里顺带提一下苹果沙盒文件里的文件目录

Documents、Library、tmp这三个文件夹。
1 Documents:苹果建议将程序中浏览到的数据保存到该目录下,对用户可见。这个目录用于存储用户数据或其他应该定期备份的信息
2 Library:这个文件夹下有两个主要的子文件夹Caches和Preferences。Preferences文件放的就是平时我们用NSUserDefaults存取的东西;Caches则主要存取我们自己下载的一些文件数据。Library对用户不可见。
3 tmp:是一个零时文件夹。保存app启动过程中产生的信息。

Documents和Library文件夹在iCloud和iTunes备份的时候会被备份。tmp在iPhone重启或app内存不够的时候就会被清空。

2 UIApplication

UIApplication 是应用程序启动之后创建的第一个对象,且是单例对象。
大部分应用级别的设置都可以使用UIApplication进行设置

  • 1 设置应用程序图标上的未读通知数
UIApplication * app = [UIApplication shareApplication];
UIUserNotificationSettings * setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[app registerUserNotificationSettings:settings];
app.applicationIconBadgeNumber = 99;
  • 2 设置应用程序状态栏中正在请求网络的旋转小标志
UIApplication * app = [UIApplication shareApplication];
app.networkActivityIndicatorVIsible = YES;
  • 3 跳转URL或app或打电话
//网址
UIApplication * app = [UIApplication shareApplication];
[app openURL:[NSURL URLWithString:@"https://www.baidu.com"] options:[[NSDictionary alloc] init] completionHandler:^(BOOL success) {
}]; 
//电话
[app openURL:[NSURL URLWithString:@"tel://10086"] options:[[NSDictionary alloc] init] completionHandler:^(BOOL success) {
}];
  • 4 AppDelegate 生命周期
1、didFinishLaunchingWithOptions      //app启动完毕
2、applicationWillResignActive      //失去焦点:失去和用户的交互能力
3、applicationDidEnterBackground      //app已经进入后台——一般用来保存数据
4、applicationWillEnterForeground     //进入前台
5、applicationDidBecomeActive     //拥有焦点,恢复交互能力
6、applicationWillTerminate          //app销毁的时候调用
     app启动会调用: 1——5
     app进入后台依次调用: 2——3
     app进入前台依次调用: 4——5
     app杀死依次调用: 2——3——6

3 App启动过程和原理

main函数之前:
操作系统iOS一开机就开始启动一个系统的Runloop函数,以每秒60次的帧率不断监听这手机界面的用户交互事件。一旦触摸就会触发一个触摸事件,然后将事件放入事件队列,紧接着就会通过端口找到对应的app,然后调用app的main函数——也就是OC文件中的main.m文件中的main函数

main函数:
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

main函数里调用了UIApplicationMain函数。UIApplicationMain的第三个参数要么是UIApplication,要么是UIApplication的子类,第四个参数则是确定UIApplication的代理是谁。

UIApplicationMain
     UIApplicationMain函数则创建UIApplication对象,设置UIApplicationMainDelegate代理
     接着,开启事件循环(消息循环) 开启Runloop --> 加载info.plist -->如果设置了MainInterface,就加载对应的storyboard(创建window 创建初始化控制器)

4 Window

程序启动过后创建的第一个视图控件就是UIWindow,默认就是全屏的;
如果没有在info.plist里设置mian interface,那么就得我们自己在app启动之后(didFinishLaunchingWithOptions中)自己去创建一个window;
如果要让window显示则必须满足两个条件:

  • 1、给window设置rootViewcontroller;
  • 2、调用makekeyandvisible让其可见:
_window = [[UIWindow alloc] init]; //默认的
_window.backgroundColor = [UIColorredColor];
_window.rootViewController = [[UIViewControlleralloc] init];
[_window makeKeyAndVisible];

程序会有多个window,但是只有一个keywindow。而且是最后执行makeKeyAndVisible的window才是主窗口,注意这个和window的frame是没有关系的:
创建第一个window

_window = [[UIWindow alloc] init]; //默认的
    _window.backgroundColor = [UIColor redColor];
    _window.rootViewController = [[UIViewController alloc] init];
    [_window makeKeyAndVisible];

创建第二个window

_window1 = [[UIWindow alloc] init]; //默认的
    _window1.backgroundColor = [UIColor blueColor];
    _window1.frame = CGRectMake(20, 20, 100, 200);
    _window1.rootViewController = [[UIViewController alloc] init];
    [_window1 makeKeyAndVisible];

在keywindow上加一个view

UIView * test = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
    test.backgroundColor = [UIColor yellowColor];
    [[UIApplication sharedApplication].keyWindow addSubview:test];

说明keywindow是window1

window有三个层级:UIWindowLevelNormal、UIWindowLevelAlert、UIWindowLevelStatusBar

如果没有设置level,则window就是按照makeKeyAndVisible的调用顺序依次添加进去的。如果设置了层级,则层级从最底层到最上层依次是UIWindowLevelNormal——UIWindowLevelStatusBar——UIWindowLevelAlert

5 ViewController

UIViewController的各种创建方式

  • 1、[alloc init]纯代码创建控制器,默认的frame就是全屏的,而且是透明色
FCFViewController * FCFVC = [[FCFViewController alloc]init];
  • 2、第二种方法,通过storyboard加载
UIStoryboard * sb = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
01
 FCFViewController * FCFVC = [sb instantiateInitialViewController]; //这个函数返回storyboard中initial(也就是箭头所指的view controller,这里需要自己去storyboad中把那个Is Initial View Controller勾上)的view controller
02
 FCFViewController * FCFVC = [sb instantiateViewControllerWithIdentifier:@"switch"]; 
//这个函数就是根据storyboard里view controller的对应的Storyboard id标识符拿到的view controller
  • 3、第三种方式,通过xib加载,这里是创建View Controller不勾选创建xib,单独创建一个xib
/* 创建一个xib,不要修改xib里的任何东西
  *File's Owner :所有者,改成view controller的类名
  * 连线view :将xib的view作为所有者VC的view
  */
 FCFViewController * FCFVC = [[FCFViewController alloc] initWithNibName:@"Text" bundle:nil]; //这里返回的是控制器vc

6 View

  • 1、 纯代码 ,创建一个透明色,且frame和屏幕一样大的view
TestViewController * vc = [[TestViewController alloc]init];
  • 2、sb创建,就是storyboard里面的view
TestViewController * vc = [[UIStoryboard storyboardWithName:@"Test" bundle:nil] instantiateInitialViewController];
  • 3、xib 指定xib,view就是xib里描述的一样
TestViewController * vc = [[TestViewController alloc] initWithNibName:@"View" bundle:nil];
  • 4、xib 创建同名xib,就是在单独创建xib的时候把xib的名称写成VC的名称,同样正常配置File's owner 和 连线view, alloc init就可以了,系统会找同名的xib-"TestViewController",如果没有就加载同名的不带Controller的xib-"TestView".
TestViewController * vc = [[TestViewController alloc]init]; //先找TestViewController,再找TestView

7、ViewController生命周期

  • 1、这里最关键的两点就是loadView的执行时机和viewDidLoad的执行时机。
    loadView是懒加载,如果我们没有在init方法是使用self.view,正常的加载顺序就是init执行完之后——>执行loadview——>执行viewDidLoad。但是因为loadView是懒加载,所以在init方法里面调用了self.view,那么在用到self.view的时候就会马上执行loadView,执行完loadView马上会执行viewDidLoad,然后才返回init方法里执行self.view之后的代码,实例:
@interface TestController ()
@property (nonatomic, assign)BOOL boolvalue;
@end

@implementation TestController

- (instancetype)init
{
  self = [super init];
  if (self) {
  NSLog(@"1");
  self.view.backgroundColor = [UIColor redColor];
  self.boolvalue = YES;
  NSLog(@"2");
  }
  return self;
}

- (void)loadView{
  NSLog(@"3");
  self.view = [UIView new];
  NSLog(@"4");
}

- (void)viewDidLoad {
  [super viewDidLoad];
  NSLog(@"5");
  if (self.boolvalue) {
  NSLog(@"6");
  }
  NSLog(@"7");
}

这里执行的结果是:1、3、4、5、7、2。注意这里不会执行6,因为那时还没执行self.boolvalue=YES,而BOOL的默认值是false。

如果这里把self.view.backgroundColor = [UIColor redColor];注释掉,则执行的结果就是:1、2、3、4、5、6、7

可以去github上查看Demo,喜欢的话star一下哦
github
CSDN

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

推荐阅读更多精彩内容