一.模态ViewController
程序中切换⻚面,可以使⽤用
UINavigationController
。通过导航功能实现⻚面切 换。
某种情况下,可以使⽤视图控制器的一对⽅法实现切换⻚面 1.
presentViewController:animated:completion:
展⽰示新的⻚面 2.
dismissViewControllerAnimated:completion:
从新⻚面返回
通过上述⽅方法显⽰示的
controller
被称为模态视图控制器。
注:模态视图控制器不是 一个类,只是一种方式显示的
controller
。
UIImagePickerController
。调⽤用系统相册、照相机。 临时展示⼀一些内容。例如:程序中用户登录,通讯录中添加联系⼈
等。
导航控制器控制的
controller
具有层级关系。
present
控制显示的
controller
与之前的
controller
是两个层级。
presentViewController:animated:completion:
模态显示
controller
在
controllerA
中模态显⽰示
controllerB
presenting
view controller =>
controllerA
presented view controller => controllerB (
被弹出的
)
dismissViewControllerAnimated:completion:
弹出模态
controller
~两种实现方式,在模态
controller
中使用:
[
self
dismissViewControllerAnimated:YES completion:nil];
[
self.presentingViewController
dismissViewControllerAnimated:YES completion:nil];
使⽤用
self
调用方法,系统会使用
self.presentingViewController
调用这个方 法。
~两种模式:
modalPresentationStyle
模态
controller
显⽰示样式
modalTransitionStyle
模态显示动画样式
二.单例
单例。单:唯一性。例:实例对象。即使用某个类创建的对象是程
序中唯一的实例对象。
注:通常每次使⽤用
alloc
创建的是不同的对象。
如果⼀个类只能创建⼀个对象,称为单例类。单例类可以是⼯具类, 视图类,控制器类。
某些时候,程序中的多个类需要使⽤同⼀个变量。如何处理?将变量
定义在单例类中,则所有类在操作这个变量时都很⽅便容易。
注意 :
操作单例对象的变量存储在静态区,程序关闭后由系统自动回收。
单例对象存储在堆区,不释放,程序关闭后由系统自动回收。
变量和单例对象的生命周期与程序同步。
优势:
在内存中只有⼀一个对象,节省内存空间。
避免频繁的创建销毁对象,可以提高性能。
避免对共享资源的多重占用。
可以全局访问。
降低模块之间的耦合度,降低代码的复杂度。
MyHandle.h
@interface MyHandle : NSObject
// 声明一个属性 用于传值
@property (nonatomic,retain)NSString *name;
// 声明类方法 如果不声明 在类外部调用不了
+ (MyHandle *)shareHandle;
// 声明一个属性 用于传值
@property (nonatomic,retain)NSString *name;
// 声明类方法 如果不声明 在类外部调用不了
+ (MyHandle *)shareHandle;
@end
MyHandle.m
* 单例
* 1. 单例是个类 创造出来的对象是单例对象
* 2. 单例对象一旦被创造出来(开辟空间) 只有到程序结束才能被释放 即只能被初始化一次
3. 单例对象使用类方法创建
4. 不用程序员管理内存 随程序的关闭而自动释放
5. 方法的命名规范----> share开头
*/
/*
* 单例的用途
1. 可以在界面当中进行界面传值
(1). 怎么传值?
2. 对数据的操作(类方法)
*
*/
+(MyHandle *)shareHandle
{
// 首先 在静态区定义一个指针
static MyHandle *handle = nil; // 静态区的指针 (只初始化一次)
// 如果这个指针指向的区域为空
if (handle == nil) {
//就在堆区开辟空间 常见对象
// 一旦初始化 就不可能为空 即只被初始化一次
handle = [[MyHandle alloc]init]; // 堆区分配内存空间
}
// 面试可能会被问到的
// 单例为什么不使用自动释放?
//答: 1. 系统方法中有未知的自动释放池,如果对一个对象进行autorelease自动释放的话,该对象可能会进入未知的系统释放池中被释放,可能会出现内存问题.
return handle; // 静态区的指针指向了堆区分配的内存空间 由系统结束时候来自动回收这块内存区域
* 1. 单例是个类 创造出来的对象是单例对象
* 2. 单例对象一旦被创造出来(开辟空间) 只有到程序结束才能被释放 即只能被初始化一次
3. 单例对象使用类方法创建
4. 不用程序员管理内存 随程序的关闭而自动释放
5. 方法的命名规范----> share开头
*/
/*
* 单例的用途
1. 可以在界面当中进行界面传值
(1). 怎么传值?
2. 对数据的操作(类方法)
*
*/
+(MyHandle *)shareHandle
{
// 首先 在静态区定义一个指针
static MyHandle *handle = nil; // 静态区的指针 (只初始化一次)
// 如果这个指针指向的区域为空
if (handle == nil) {
//就在堆区开辟空间 常见对象
// 一旦初始化 就不可能为空 即只被初始化一次
handle = [[MyHandle alloc]init]; // 堆区分配内存空间
}
// 面试可能会被问到的
// 单例为什么不使用自动释放?
//答: 1. 系统方法中有未知的自动释放池,如果对一个对象进行autorelease自动释放的话,该对象可能会进入未知的系统释放池中被释放,可能会出现内存问题.
return handle; // 静态区的指针指向了堆区分配的内存空间 由系统结束时候来自动回收这块内存区域
}
三.通讯录实战