标签:
LaunchScreen
)Xcode5
Xcode6
Xcode7
LaunchScreen原理:
如果没有指定的话,就不会去加载LaunchScreen
作为启动界面.
如果没有设置启动图片,模拟器默认的尺寸大小是4s的尺寸大小.(可以打印屏幕尺寸验证.)
NSLog(@"%@",NSHomeDirectory());
Library->Caches->Snapshots
目录下面.最后一层就是程序自动生成的图片.Supporting file
一般都是放些资源文件,像一些plist
这些等这个当中,主要掌握三个Key
Bundle Name:应用程序的名称.
Bundle version string,short:应用程序的版本.在开发当中都是迭代开发.苹果要求下一次提交的版本必须得要比上一次提交的版本要高.
Bundle Version:应用程序编译的版本.
Bundle identifier:应用程序标识符.保证应用程序的唯一性
如果两个应用同一个标识符, 那么之前的那个应用会被覆盖.
当应用上传到AppStore的时候必须得要有标识符.当做推送的时候也必须得要Bundle identifier.Targets对应者info.plist.文件.
3.pch可以自定义Log.
三个点...表示可变参数.
__VA_ARGS__
Log(...) NSLog(__VA__ARGS__)
可以手动管理,直接注释掉.PCH:注意PCH会把它当中的所有内容导入到工程当中所有的文件.但如果工程当中有C语言文件的时候,它也是会把它给导入到C语言的文件当中.如果这样的话, 就会发生错误.?
解决办法:每一个OC文件都会定义一个__OBJC__
宏,只要判断有没有定义这样一个宏,就能看出是不是C语言的文件,如果没有定义这样的宏, 那就不需要导入这些东西.就不会报错.
什么是UIApplication?
UIApplication作用?
模仿UIApplication单例.
创建的对象只能通过share的方式获取对象.不能够进行alloc 操作,当执行alloc时, 程序发生崩溃
#import "Person.h"
@implementation Person
// 保证只创建一次,所以static修饰,让其保存到静态区
static Person *_person;
// 当类加载到内存中就会调用这个方法, 在main函数之前调用
+ (void)load {
// 当类加载完毕就创建一个对象
_person = [[self alloc] init];
}
+ (instancetype)sharedPerson {
return _person;
}
+ (instancetype)alloc {
// 如果_person有值.直接让程序挂掉,并输出异常信息
if (_person) {
// 创建异常
NSException *exc = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one UIApplication instance." userInfo:nil];
// 抛出异常
[exc raise];
}
// 如果没有值.调用 [super alloc]按照系统默认处理
return [super alloc];
}
@end
// 取得UIApplication对象
UIApplication *app = [UIApplication sharedApplication];
// 从iOS8之后,需要自己先注册用户通知,才能接受提醒
UIUserNotificationSettings *user = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
// 注册通知
[app registerUserNotificationSettings:user];
// 设置提醒数量
app.applicationIconBadgeNumber = 15;
app.networkActivityIndicatorVisible = YES;
// 隐藏状态栏
// app.statusBarHidden = YES;
// UIStatusBarStyleDefault 默认样式 黑色
// UIStatusBarStyleLightContent 白色
app.statusBarStyle = UIStatusBarStyleLightContent;
// 控制器设置状态栏样式和隐藏状态栏
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
- (BOOL)prefersStatusBarHidden {
return YES;
}
4.openURL
// 打电话 tel:// 协议头 10010 指定电话
NSURL *url = [NSURL URLWithString:@"tel://10010"];
[app openURL:url];
// 发短信
NSURL *url2 = [NSURL URLWithString:@"sms://10010"];
[app openURL:url];
// 打开网页......邮件等等
NSURL *url3 = [NSURL URLWithString:@"http://www.king129.com"];
[app openURL:url3];
这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件
delegate可处理的事件包括:
UIApplication会在程序一启动时候创建一个遵守UIApplicationDelegate代理.
主要方法有:
/**
* 当程序启动完毕时,就会调用这个方法
*/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"%s", __func__);
return YES;
}
/**
* 当获失去焦点是就会调用
*/
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
* 当程序进入后台时调用(比如按了 Home键)
*/
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
* 当程序从后台切换到前台时
*/
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
* 当程序获取焦点时调用
*/
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
* 程序已经退出时调用
*/
- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
* 收到内存警告时调用.....
*/
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
NSLog(@"%s", __func__);
}
2.应用程序的程动原理
// 1.执行main --> UIApplicationMain
// 2.创建UIApplication对象,并设置他的代理
// 3.开启一个事件循环(主运行循环,死循环),保证程序一直运行
// 4.加载项目的info.plist文件,检查文件中是否有 Main ,如果有则加载 Main.storyboard,如果没有则执行\
application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 程序启动完毕
int main(int argc, char * argv[]) {
@autoreleasepool {
// 第三个参数: 设置UIApplication对象的名称
// 第四个参数: 创建代理对象, 遵守UIApplicationDelegate协议,并把这个对象设置为程序(UIApplication)的代理对象
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow
在加载info.plist,判断下是否指定main,如果指定了,就会去加载StoryBoard.
如果没有指定Mian话, 那这个时候就需要我们手动的去创建窗口.
强引用
.窗口也是控件,要想展示出来.必须得要有尺寸
.self.window.windowLevel = UIWindowLevelNormal;
// 层级关系
UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert
//1.创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//2.设置窗口根控制器
//从StoryBoard当中加载控制器.
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//加载StoryBoard当中剪头指向的控制器
//UIViewController *vc = [storyBoard instantiateInitialViewController];
//加载指定标识的控制器.
UIViewController *vc = [storyBoard instantiateViewControllerWithIdentifier:@"VC"];
self.window.rootViewController = vc;
//3.显示窗口
[self.window makeKeyAndVisible];
// 1.创建window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.设置根控制器
// 从xib中加载控制器
// UIViewController *vc = [[SJViewController alloc] initWithNibName:@"SJViewController" bundle:nil];
// self.window.rootViewController = vc;
//指定名称为nil时.
//1.如果指定名称.会先去加载指定名称的Xib.
//2.如果没有指定xib名称,它会第一个先去找,跟它同名的xib.
//如果没有同名,它会去找同名,去掉Controller的xib.
//如果没有的话, 它会创建背景颜色为透明的View.
//3.如果没有指定xib名称,它会自动加载SJViewController去掉Controller的xib.
// UIViewController *vc = [[SJViewController alloc] initWithNibName:nil bundle:nil];
UIViewController *vc = [[SJViewController alloc] init];
// 控制器的init方法,底层实现原理就是调用 initWithNibName:
self.window.rootViewController = vc;
// 3.显示窗口
[self.window makeKeyAndVisible];
标签:
原文地址:http://www.cnblogs.com/king129/p/5008935.html