015.8.4 第九堂 扩展-单例模式


一、Extension

         复习:成员变量关键字 public private protected

         一、给类添加私有的方法/属性,用Extension延展(Extension匿名的类别,延展定义的私有方法。一般在类的实现文件@implementation之上定义,extensioncategory的区别在于括号里是空的,没有名字。

         暂时性的存在,定义的方法只能本类调用,子类无法调用父类的延展

        

        二、.extensioncategory的区别:

         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.消息中心

         自定义一个类,用三种方式为这个类提供一个单例


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值