iOS 基础01--项目文件、applecation、启动过程、

2018-09-18  本文已影响17人  ShayneFcf

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

1 项目中常见的文件

[[NSBundle mainBundle]infoDictionary]; //这个字典拿到的就是info.plist里的东西,比如获取版本号
NSString * versionStr = [[[NSBundle mainBundle]infoDictionary] objectForKey:@"CFBundleShortVersionString"];

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

#ifdef __OBJC__ //OC文件中使用
 #ifdef DEBUG //在debug条件下执行
 #define FCFLog(...) NSLog(__VA_ARGS__) //自定义的打印函数
 #else
 #define FCFLog(...) //NSLog(__VA_ARGS__)
 #endif
#endif

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进行设置

UIApplication * app = [UIApplication shareApplication];
UIUserNotificationSettings * setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[app registerUserNotificationSettings:settings];
app.applicationIconBadgeNumber = 99;
UIApplication * app = [UIApplication shareApplication];
app.networkActivityIndicatorVIsible = YES;
//网址
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) {
}];
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显示则必须满足两个条件:

_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的各种创建方式

FCFViewController * FCFVC = [[FCFViewController alloc]init];
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
/* 创建一个xib,不要修改xib里的任何东西
  *File's Owner :所有者,改成view controller的类名
  * 连线view :将xib的view作为所有者VC的view
  */
 FCFViewController * FCFVC = [[FCFViewController alloc] initWithNibName:@"Text" bundle:nil]; //这里返回的是控制器vc

6 View

TestViewController * vc = [[TestViewController alloc]init];
TestViewController * vc = [[UIStoryboard storyboardWithName:@"Test" bundle:nil] instantiateInitialViewController];
TestViewController * vc = [[TestViewController alloc] initWithNibName:@"View" bundle:nil];
TestViewController * vc = [[TestViewController alloc]init]; //先找TestViewController,再找TestView

7、ViewController生命周期

@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

上一篇 下一篇

猜你喜欢

热点阅读