一、Extension
复习:成员变量关键字 public private protected
一、给类添加私有的方法/属性,用Extension; 延展(Extension)“匿名”的类别,延展定义的私有方法。一般在类的实现文件@implementation之上定义,extension和category的区别在于括号里是空的,没有名字。
暂时性的存在,定义的方法只能本类调用,子类无法调用父类的延展
二、.extension和category的区别:
1.形式上来看,extension是匿名的category;
2.extension里声明的方法需要在implementation中实现,category不强制要求;
(类的扩展里面的方法必须实现)
3.extension可以添加属性(变量),category不可以(继承也可以添加属性)
*/
/*我们使用扩展的方式:通常我们只会在extension里面声明私有属性变量*/
三、注意事项:如图
如在.m文件中:
//打出@interface后提示问你 定义一个类or类别or类的扩展
@interface Person ()//类别有别名,而扩展没有别名,括号里为空
@property(nonatomic,strong)NSString *password;//私有化属性变量 不要放到头文件里面去
@property (nonatomic,strong)NSString *name;
/*当扩展里面的属性变量和.h文件的属性变量相同时,
.h里面这个属性变量只能是readOnly,扩展里面的属性变量只能是readWrite
即内部可读可写,外部可读(给外部暴露一个接口)*/
//-(void)printPassword;//类的扩展里面的方法必须实现
@end
四、实战:如图
答案是不能。私有变量不能调用。
二、单例模式
如图:图解单例
一、概念:单例模用于一个类只能有一个实例的时候
通常情况下这个“单例”代表的是某一个物理设备,如打印机
或是某种不可以有多个实例同时存在的虚拟资源或是系统属性
比如一个程序的某个引擎或是数据
用单例模式加以控制是非常有必要的
二、作用:
1.封装一个共享的资源 硬件资源、共享数据
2.提供一个固定的实例创建方法 封装某些操作
3.提供一个标准的实例访问接口 体现OOP
二、三种定义方式:见.m文件
//
// FileOperation.m
// 单例模式
//
// Created by tusm on 15-9-12.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import "FileOperation.h"
/*单例模式
在整个程序运行中,这个类的一个对象只有一个:单例
如:唯一的国家主席-V- lol的英雄
实现方式:静态全局变量-> 堆上*/
//定义3:代码简单清晰,线程安全,效率高
@implementation FileOperation
+(instancetype)sharedInstance{
static FileOperation *instance = nil;
static dispatch_once_t token;//用来记录这个操作是否执行完毕
dispatch_once(&token,^{//这个代码块只执行一次而且只有一次
instance = [[FileOperation alloc]init];
});
return instance;
}
@end
/*定义2:线程安全 但效率不高
//复习atomic nonatomic:前者有加锁解锁机制,所以效率低。后者反之同理。
static FileOperation *instance = nil;
@implementation FileOperation
+(instancetype)sharedInstance{
@synchronized(self){//self得到当前类的对象
if (instance == nil) {
instance=[[FileOperation alloc]init];
}
return instance;//离开代码块时会解锁
}
}
@end
*/
/* 定义1:缺陷是线程不安全
//1.声明一个静态的全局变量
static FileOperation *instance = nil;
@implementation FileOperation
+(instancetype)sharedInstance{
//2.判断以下instance是否为空 (确保唯一性)
if (instance == nil) {
//3.创建一个对象
instance = [[FileOperation alloc]init];
}
return instance;// 已经存在直接返回
}
@end
*/
四、单例存在问题:如图
如果写的是alloc init,就会出错,不再是同一个对象。
/*使用单例方法创建一个对象 会发现是同一个
FileOperation *o1=[FileOperation sharedInstance];
FileOperation *o2=[FileOperation sharedInstance];
NSLog(@"o1:%@",o1);
NSLog(@"o2:%@",o2);*/
//如果开发者不按照规定的方式去创建这个对象
//会导致整个程序运行过程中,这个类有很多对象
FileOperation *o1=[FileOperation sharedInstance];
FileOperation *o2=[[FileOperation alloc]init];
FileOperation *o3=[FileOperation allocWithZone:NULL];
NSLog(@"o1:%@",o1);
NSLog(@"o2:%@",o2);
解决方案:重写父类提供的方法 如图
具体修改比较复杂少用,所以此处省略。
五、括号缩写 新技能get
复制一句代码,鼠标左键按住移动到右下角{}中,可进行缩写定义。
六、ios单例使用举例及实例:
1.文件操作
2.数据存储
3.消息中心
自定义一个类,用三种方式为这个类提供一个单例