OC学习篇之-----单例模式

来源:互联网 发布:python官网 中文版 编辑:程序博客网 时间:2024/05/24 05:30

单例模式:


/*
     
     设计模式(用来解决编程某些特定问题) --单例模式
      单例模式:
       什么时候使用单例模式?
         在一个工程中,一个类只需要一个实例变量,我们就可以讲这些类设计成单例模式
     
     单例模式的作用:
        当一个类A被设计成单例模式时,由类A构造出的实力对象对于其他类来讲为全局实例对象,即在每一个类中有A构造出的实例对象,都没相同的对象
     单例模式的实现思路:一个类只能穿件一个实例和一个获得该实例的方法;
 
     */


其实单例模式就是实现一个类的对象只能在整个工程中存在一个,所以我们要做的就是,防止此类继续创建实例对象,或者 无论怎么创建都是同一个对象

首先要声明一个全局变量:确保全局就它一个实例对象


如下:1.

#import "Student.h"
      //为单例模式声明一个静态实力对象,只会在第一次执行一次
     static Student *st = nil;

@implementation Student

@end


2.在实现文件中声明一个方法,用来第一次创建实例对象,同时检测是否已经存在本实例对象,如下:

#import <Foundation/Foundation.h>

@interface Student : NSObject

    //1.在要被设计成单例模式的类的.H文件中声明一个构造单利的方法
+(Student *)shareInatance;

@end


3,在。m文件里面实现构造单例的模式,如下:

+(Student *)shareInatance{
    if (st == nil) {
        st = [[Student alloc]init];
    }
    return st;
}

(如果单单由上面的方法创建出来的对象的话,都是同一对象,但是还可以通过alloc和new来创建新的实例对象的,所以我们还需要通过重写alloc和new创建实例的方法来确保实例对象的单一化)


//为了防止alloc或new创建新的实例变量,重写一下方法
+(instancetype)allocWithZone:(struct _NSZone *)zone{
    
    @synchronized(self)    //关于@synchronized(self):它的作用是创建一个互斥锁,保证此时没有其他线程对self对象进行修改,这个是OC中的一个锁令牌,防止self对象在同一时间内被其他线程访问,祈祷线程保护作用,一般在公用公用变量中使用,例如单例模式 或者 操作类的static变量中使用
    {
        if (st == nil)
        {
            st = [super allocWithZone:zone];
        }

    }
        return st;
}

(上面已经解决了实现方法,alloc和new创建单一实例变量的单一性,但还有一个方法会产生实例对象,就是copy的实例化对象,所以,一样要从写,如下:)


//为了防止COPY产生新的对象,需要实现NSCopy协议
-(id)copyWithZone:(NSZone *)zone{
    return self;
}


好了,单例模式就这么点东西,也可以说就是这么一个模板,只要把这个模板记着就以后都会用了

总结:

1.创建一个全局变量

2.声明和实现一个创建单一变量的方法,把创建出来的单一对象给予全局变量

3.解决重复创建问题

3.1.重写alloc和new的allocWithZone方法;防止alloc或new新对象

3.2.重写copy的copyWithZone方法:防止copy新对象





















 

0 0
原创粉丝点击