App的生命周期 参考

多态的使用

//
// main.m #import <Foundation/Foundation.h>
#import "SingleDog.h"
#import "Cat.h"
#import "Animal.h"
#import "BigYellowDog.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
/*
多态:程序在运行的时候会有很多种表现形式;(不同的对象以自己的方式响应相同名称方法的能力称为多态) 条件:
必须要有继承,没有继承就没有多态。 要有方法重写(子类重写父类的同名方法); 在使用多态时,会进行动态检测,以调用真实的对象方法。 多态在代码中的体现即父类指针指向子类对象。 */ Animal *ani = [[Animal alloc] init];
[ani run]; SingleDog *sd = [[SingleDog alloc]init]; [sd run]; Cat *cat = [[Cat alloc] init];
[cat run]; //多态实现; Animal *a1 = [[SingleDog alloc]init];//父类指针 指向子类的对象;
//a1 指向内存堆区的SingleDog类的对象的地址 然后调用代码区中 SingleDog 的run方法;
[a1 run]; Animal *a2 = [[Cat alloc]init]; [a2 run];//父类动物 调用猫; SingleDog *sd1 = [[BigYellowDog alloc]init];
[sd1 run];//父类单身狗调用大黄狗; Animal *a3 = [[BigYellowDog alloc]init]; [a3 run];//父父类(爷爷类)调用大黄狗 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //刚才调用的是同名方法run方法,若调用非同名方法?
Animal *a4 = [[SingleDog alloc]init]; // [a4 eat]; //此时编译会报错,系统默认的Animal 类没有eat方法; [(SingleDog *)a4 eat];//瞒过编译 。 Animal *a5 = [[Animal alloc]init]; [(SingleDog *)a5 eat];// 这种方法能骗过编译器不会报错,但是因为Animal类对象没有eat 这种方法。程序crash;
// /* 好处:简化了程序接口,容许在类与类之间重用一些习惯性的命名,不用为新加的函数命名一个新名字。如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了。 局限性:父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。
*/ }
return ;
}

main.m

//
// Animal.h #import <Foundation/Foundation.h> @interface Animal : NSObject //爷爷类
-(void)run;
@end

person.h

//
// Animal.m #import "Animal.h" @implementation Animal
-(void)run{
NSLog(@"Animal 在跑");
}
@end

person.m

//
// SingleDog.h
// duotai #import "Animal.h" @interface SingleDog : Animal //儿子类 (动物 -》 单身狗)
-(void)eat;
@end

singleDog.h

//
// SingleDog.h
// duotai #import "Animal.h" @interface SingleDog : Animal //儿子类 (动物 -》 单身狗)
-(void)eat;
@end

singleDog.m

//
// Cat.h
// duotai
//
//
#import "Animal.h" @interface Cat : Animal //儿子类 (动物 -》猫) @end

cat.h

//
// Cat.m
// duotai #import "Cat.h" @implementation Cat
-(void)run{ NSLog(@"Cat 在跑");
}
@end

cat.m

//
// BigYellowDog.h
// duotai #import "SingleDog.h" @interface BigYellowDog : SingleDog //孙子类 (动物 -》 狗 -》 单身狗) @end

bigYellowDog.h

//
// BigYellowDog.m
// duotai #import "BigYellowDog.h" @implementation BigYellowDog
-(void)run{
NSLog(@"大黄狗在跑"); }
@end

bigYellowDog.m

mian函数的作用有三个:

1、创建应用程序的对象 UIApplication 类
2、设置应用程序的代理
3、创建事件循环  runloop (是一个死循环,实际上加了一个计时器)监视用户的交互

使用NSlog可以打印出当前的方法的名字,以及所在的行数,这对于调试很有帮助,使用方法是

NSLOG("%@",__FUNCTION__);//打印所在的方法

NSLOG("%@",__LINE__);//打印所在的行数

一个App的启动时候,在mian 函数所创的代理协议中要执行的函数如下:

//应用程序加载时候触发的方法,加载需要显示的内容
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
NSLog(@"应用程序加载 %s 方法 (应用程序加载时候触发的方法,加载需要显示的内容)所在行数 %d",__FUNCTION__,__LINE__);
// __FUNCTION__ 当前调用的方法名字
// __LINE__ 当前方法所在的行数 // cmd + k 清除控制台输出的内容
// cmd + shift + hh 显示所有的后台程序
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
} //应用程序将要取消活跃的状态的时候要触发的方法
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"应用程序加载 %s 方法 (应用程序将要取消活跃的状态的时候要触发的方法)所在行数 %d",__FUNCTION__,__LINE__);
//应用程序将要取消活跃的状态的时候要触发的方法(例如:突然有一个电话打过来,这里面可以有一个操作,保存一下数据 ) 应用程序不再处于活跃的状态
//使用该方法用来暂停正在运行的任务,然后让计时器失效,还可以让游戏暂停
} //应用程序进入后台时候触发
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"应用程序加载 %s 方法 (应用程序进入后台时候触发)所在行数 %d",__FUNCTION__,__LINE__);
//使用该方法释放共享资源,保存用户的数据,让计时器失效,存储当前的应用程序的状态(例如:用网页浏览新闻,当推出的时候,下次再打浏览器,就会回到我们当前浏览的页面)
// 如果这个应用程序支持后台运行,这个方法将会替代 applicationWillTerminate ,这个方法就会被调用 (查阅:苹果手机 墓碑机制)
} //应用程序将要进入前台
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"应用程序加载 %s 方法 (应用程序将要进入前台)所在行数 %d",__FUNCTION__,__LINE__);
//该方法用来唤醒重新进入后台时的任务 } //应用程序变成活跃状态
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"应用程序加载 %s 方法 (应用程序变成活跃状态) 所在行数 %d",__FUNCTION__,__LINE__);
//应用程序变成活跃状态(当前正在使用应用程序被暂停后 又打开)打开之后
//重启当应用程序不活跃的状态时暂停时的任务,或者开启没有启动的任务。
//如果应用程序之前处于后台的状态,可以刷新一下用户的页面 } - (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"应用程序加载 %s 方法 所在行数 %d",__FUNCTION__,__LINE__);
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

App启动的时候Appdelegate的代理方法说明

要能够会使用 :复合设计模式,就是将不同的控件组合在一个类中,然后在另一个类中可以加载这个组合在一起的组合控件,常用到登陆,注册页面的布局

UI学习

(UI控件很简单,主要是业务逻辑处理和算法要下功夫) cocaChina网站、推酷。

//didFinishLaunchingWithOptions 确实加载了

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//创建应用窗口的对象,呈现应用的内容

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];//这里加了一个autorelease

// Override point for customization after application launch. 在应用程序加载之后重写一些个性化的设置代码

//设置颜色

self.window.backgroundColor = [UIColor orangeColor];

// makeKeyAndVisible 让窗口变成程序的主窗口,并且可视

[self.window makeKeyAndVisible];//注释方法然后看UI变化,就知道这个方法了

return YES;

}

//    UIView 视图类 所有在屏幕上能看到的都是他的子类或者控件

//    总结 UIView 的属性  backgroundColor 视图背景颜色

//    hidden     隐藏

//     alpha     透明度  取值为(0-1)默认的是 1,完全不透明

//     tag       唯一的标示

//     subviews  子视图  NSArray(用数组存放)

//     superview 父视图 用UIview

view.hidden = YES;//隐藏中间的

view.alpha = 0.6;

view2.alpha = 0.3;

view3.alpha = 0.3;

view4.alpha = 0.3;

view5.alpha = 0.3;

//设置唯一的标示 通过 tag 可以用父视图的 viewWithTag 来找到这个被标示的视图  一般设为大于100

view.tag = 101;

UIView * aview = [self.window viewWithTag:101];

NSLog(@"%@  %@",view,aview);//打印视图信息

aview.hidden = NO;//不隐藏,就是显示

//window 的子视图

NSArray * views =  [self.window subviews];

for (UIView * view in views) {

NSLog(@"%@",view);

}

//子视图

NSArray * viewArr =  self.window.subviews;

NSLog(@"子视图有:%@",viewArr);

// superview 找视图的父视图

UIView * superView =  view.superview;

NSLog(@"%@",superView);

/**/------注释

//创建一个绿色视图(50 50 100 50 )设置 tag 值,透明度为 0.6

UIView * greenView = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 50)];

greenView.tag = 102;

greenView.backgroundColor = [UIColor greenColor];

greenView.alpha = 0.6;

//    UIView * findGreen =  [self.window viewWithTag:102];//如果这里注释掉,运行后找不到此视图?????待解决

[self.window addSubview:greenView];

greenView.alpha = 0.6;

[greenView autorelease];

//Frame  相对于父视图的位置,大小。

//bounds 一个视图的边界的大小 相对于自身的坐标的位置

//获取 greenView 的 frame

NSString * frame = NSStringFromCGRect(greenView.frame);

NSLog(@"%@",frame);

NSString * point = NSStringFromCGPoint(greenView.frame.origin);

NSLog(@"%@",point);

CGFloat width = greenView.frame.size.width;

CGFloat height = greenView.frame.size.height;

NSLog(@"长度:%.f 宽度:%.f",width,height);

[greenView autorelease];

/**/

//创建新视图 newView

UIView * newView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 150, 150)];

newView.backgroundColor = [UIColor redColor];

//如果改变一个视图的位置,影响的是一个视图相对于父视图的位置和大小,是参考于父视图的坐标体系去设置视图的 坐标和大小

//改变视图的 frame (已经设置 有改变 就是相对于父视图的位置与大小

//    newView.frame = CGRectMake(20, 20, 50, 50);

//bounds 边界 相对于自身的坐标的位置 (也是一个结构体)

//改变 bounds 影响他子视图的大小 和 位置

//改变 bounds (后面的宽高,相当于对视图进行缩放、改变前面的 x y 影响自身的子视图)<注意这里是重点,我觉得的的重点,多多的看几遍>

newView.bounds = CGRectMake(50, 50, 150, 150);//他不会改变相对于父亲视图的大小,只会改变(自身的坐标体系)自己的坐标原点

//newView 上添加一个子视图(注意 子视图 坐标是相对于 newview的)

UIView * vie = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];

vie.backgroundColor = [UIColor greenColor];

[newView addSubview:vie];

[self.window addSubview:newView];

//视图的属性 与视图的层级管理

//创建新视图 newView

UIView * newView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 150, 150)];

newView.backgroundColor = [UIColor redColor];

//如果改变一个视图的位置,影响的是一个视图相对于父视图的位置和大小,是参考于父视图的坐标体系去设置视图的 坐标和大小

//改变视图的 frame (已经设置 有改变 就是相对于父视图的位置与大小

//    newView.frame = CGRectMake(20, 20, 50, 50);

//bounds 边界 相对于自身的坐标的位置 (也是一个结构体)

//改变 bounds 影响他子视图的大小 和 位置

//改变 bounds (后面的宽高,相当于对视图进行缩放、改变前面的 x y 影响自身的子视图)

NSLog(@"改变 bounds 之前中心点坐标:%@",NSStringFromCGPoint(newView.center));

newView.bounds = CGRectMake(50, 50, 150, 150);//他不会改变相对于父亲视图的大小(就是自身的中心点不会改变),只会改变(自身的坐标体系)自己的坐标原点,后面的两个值是管着自身的大小,就是缩放的效果

//newView 上添加一个子视图(注意 子视图 坐标是相对于 newview的)

UIView * vie = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];

vie.backgroundColor = [UIColor greenColor];

[newView addSubview:vie];

[self.window addSubview:newView];

[newView autorelease];

[vie autorelease];

//管理视图的层级关系

//    [self.window bringSubviewToFront:uiView2];//uiView2 放到最上面

//    [self.window sendSubviewToBack:uiView2];//uiView2 放到最下面

//对于一个视图来说,他只有一个父视图,但是他可以有多个子视图,子视图永远在父视图的上面

//对于一个子视图(subViews)中元素的位置和子视图添加的顺序一致,越晚放的视图就在数组的越后边,但是在显示的时候是先添加的最后显示,最后添加的先显示

//晚添加的视图如果和之前的视图有重叠的部分,会覆盖掉之前的(有重叠的内容)

//管理视图的层级关系,需要父视图(不管是添加视图:(addSubview) 还是管理层级(bringSubviewToFront  sendSubviewToBack))

//如果需要把一个视图从父亲的视图上移走的话。需要 用子视图调用 removeFromSuperview方法即可

//如果想要交换两个视图的位置  exchangeSubviewAtIndex:  withSubviewAtIndex:

[self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1];

[uiView3 removeFromSuperview];

//插入子视图在对应的下标的位置

UIView * newV = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)];

newV.backgroundColor = [UIColor redColor];

[newV autorelease];

//在创建了图层之后,我们释放了之后,还可以使用是因为在 addSubview 时候 会把他的引用计数器加1 ,self.window 以 NSArray 的形式管理子视图

//插入图层(insertSubview:newV atIndex:2 ; insertSubview:uiView2 aboveSubview:newV  ;  insertSubview:uiView2 belowSubview:newV)

//在 window 子图层,在下标为 2 的地方 插入一个图层 newV

[self.window insertSubview:newV atIndex:2];

//在一个确定的视图上面插入一个视图

//在视图 newV 上面插入 视图 uiView2

[self.window insertSubview:uiView2 aboveSubview:newV];

//在视图 newV 下面插入 视图 uiView2

[self.window insertSubview:uiView2 belowSubview:newV];

UI:基础的更多相关文章

  1. 转发-UI基础教程 – 原生App切图的那些事儿

    UI基础教程 – 原生App切图的那些事儿 转发:http://www.shejidaren.com/app-ui-cut-and-slice.html 移动APP切图是UI设计必须学会的一项技能,切 ...

  2. Android UI基础之五大布局

    Android  UI基础之五大布局 Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Andro ...

  3. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  4. Android UI基础教程 目录

    从csdn下载了这本英文版的书之后,又去京东搞了一个中文目录下来.对照着看. 话说,这本书绝对超值.有money的童鞋看完英文版记得去买中文版的~~ Android UI基础教程完整英文版 pdf+源 ...

  5. UI基础UIButton

    UI基础UIButton 前面写了UIWindow.UIViewController,那些都是一些框架,框架需要填充上具体的view才能组成我们的应用,移动应用开发中UI占了很大一部分,最基础的UI实 ...

  6. UI基础UIWindow、UIView

    UI基础UIWindow.UIView 在PC中,应用程序多是使用视窗的形式显示内容,手机应用也不例外,手机应用中要在屏幕上显示内容首先要创建一个窗口承载内容,iOS应用中使用UIWindow.UIV ...

  7. IOS开发UI基础--数据刷新

    IOS开发UI基础--数据刷新 cell的数据刷新包括下面几个方面 加入数据 删除数据 更改数据 全局刷新方法(最经常使用) [self.tableView reloadData]; // 屏幕上的全 ...

  8. Android 的UI基础布局的学习

    一. 今天学习了Android 的UI基础布局的部分,绝大多数的布局都在Androidstudio的这个界面里,如下: 在左边的框里的palette的内部,包含了的大多数的布局所要用的button按钮 ...

  9. IOS开发UI基础UIView

    主要介绍下UIView得基本概念和一些属性的介绍至于属性的用户后面会由详细的介绍 -.UIView基本概念 1.什么是控件? 屏幕上所有的UI元素都叫做控件 (也有很多书中叫做视图 组件) 比如 按钮 ...

  10. IOS的UI基础01

    内容大纲:(红色表示博主个人重点记忆) 1.指定启动界面 带箭头就是首次启动的页面2.两个常用的快捷键3.拖线子控件注意事项4.一般情况下,UIView的容器是控制器的View.5.didRecive ...

随机推荐

  1. Javaweb里面的filter,listener,servlet

    Filter 1Filter是什么:是过滤器简称 2Filter有什么作用:在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装 ...

  2. 【解题报告】PKU 2826 An Easy Problem?!

    原题链接:http://poj.org/problem?id=2826 一题很蛋疼的一题.目前为止还有一个问题我没搞清楚,问题注在代码中. 题目大意: 外面下雨了,农民Johnoson的bull(?? ...

  3. 【转】uboot移植(一)BootLoader基本概念

    原文网址:http://blog.chinaunix.net/uid-25445243-id-3869348.html 一.BootLoader简介1.1.嵌入式Linux软件结构与分布 在一般情况下 ...

  4. 通过github提升自己-测试反馈、持续精进

    如果我们仅仅是将自己的代码commit.push到github上,那么对于我们的技术不会有太多的提升.我们所做的仅仅只是将github当成了我们的网盘. 我们每发布一个版本的时候,是不是也就意味着给用 ...

  5. Android 高仿UC浏览器监控剪切板弹出悬浮窗功能

    UC浏览器应该是android手机里 最流行的浏览器之一了,他们有一个功能 相信大家都体验过,就是如果你复制了什么文字,(在其他app中 复制也有这个效果!,所以能猜到肯定是监控了剪切板),就会弹出一 ...

  6. 使用 foreach 操作数组

    foreach 并不是 Java 中的关键字,是 for 语句的特殊简化版本,在遍历数组.集合时, foreach 更简单便捷.从英文字面意思理解 foreach 也就是“ for 每一个”的意思,那 ...

  7. 开发者必读jQuery Mobile入门教程

    你每天都会对着它讲话,和它玩游戏,用它看新闻——没错,它就是你裤兜里的智能手机.android,黑莓还是iphone?为了让你清楚意识到究竟哪些才算是智能手机,我在下面总结了一个智能手机系统/设备的列 ...

  8. bsp tree

    http://www.cnblogs.com/dreams/archive/2007/03/25/687267.html http://blog.csdn.net/iduosi/article/det ...

  9. loadrunner下检查点乱码情况处理

    对于很多用过LR的人来说,乱码一直是很纠结的事情,尤其是对新手来说.网上给的解决方法是在录制的时候勾选UTF-8选项,但是似乎并没有解决. 对于用户名为中文或者检查点为中文的情况,我们又该如何去处理呢 ...

  10. 设计模式 工厂-Factory

    在开始笔记之前先推荐一个网站:http://design-patterns.readthedocs.org/zh_CN/latest/index.html 网站对每一个Pattern都有详尽的解说.并 ...