OC语法--单例设计模式,及两种创建方法

来源:互联网 发布:python处理json字符串 编辑:程序博客网 时间:2024/06/16 20:44
例设计模式
单例设计模式运用较为普通、广泛且较为简单的设计模式之一,它的设计原理是始终返回一个实例,即一个类始终只有一个实例

1.用来保存一种全局属性,全局访问
2.重量级对象,要实现太多功能,防止它重复创建,节约性能
NSFileManager  UserDefult都是单例模式

。创建单例设计模式的基本步骤
 。声明一个单件对象的静态实例,并初始化为nil。
 。创建一个类的类工厂方法,生成一个该类的实例,当       且仅当这儿类的实例为nil时
 。覆盖allocWithZone:方法,确保用户在直接分配和初始化对象时,不会产生另一个对象。
 。实现NScopying协议,覆盖relese,autorelease,retain,retainCount方法,以此确保单例的状态。
 。在多线程的环境下,注意使用@synchronized关键字,确保静态实例被正确的创建和初始化。
方法一基本方法:
UserContext.h文件

#import <Foundation/Foundation.h>

@interface UserContext :NSObject<NSCopying>

@property (nonatomic,copy)NSString *userName;

@property (nonatomic,copy)NSString *email;

//命名习惯share就知道是单例

+(id)shareUserContext;

@end

UserContext.m文件

#import "UserContext.h"

staticUserContext *segtonInstance=nil;

@implementation UserContext

+(id)shareUserContext

{

    @synchronized(self){

    if(segtonInstance==nil)

   {

   segtonInstance=[[[selfclass]alloc]init ];

    }

    returnsegtonInstance;

    }

}

#pragma mark -下面的方法为了确保只有一个实例对象

+ (instancetype)allocWithZone:(struct_NSZone *)zone

        {

       if (segtonInstance==nil) {

           segtonInstance=[superallocWithZone:zone];

        }


        returnsegtonInstance;

    }

-(id)copyWithZone:(NSZone *)zone

{

    returnsegtonInstance;

}

-(onewayvoid)release

{

}

-(id)retain

{

    returnsegtonInstance;

}

-(id)autorelease

{

    returnsegtonInstance;

}

-(NSUInteger)retainCount;

{

    returnUINT_MAX;

}

@end

   主函数中输出:都是一样的

        UserContext*ucn=[UserContextshareUserContext];

        UserContext*ucn1=[UserContextshareUserContext];

        UserContext*ucn2=[[UserContextalloc]init];

       UserContext*ucn3=[ucncopy];

        

        NSLog(@"ucn=%@,ucn1=%@,ucn2=%@ucn3=%@",ucn,ucn1,ucn2,ucn3);

输出结果: ucn=<UserContext: 0x100206a40>,ucn1=<UserContext: 0x100206a40>,ucn2=<UserContext: 0x100206a40>ucn3=<UserContext: 0x100206a40>


方法二利用多线程技术:
DemoObj.h文件中

#import <Foundation/Foundation.h>

@interface DemoObj :NSObject

// 共享实例,便于其他类访问

+ (instancetype)sharedDemoObj;

@end


DemoObj.m文件中

#import "DemoObj.h"


@implementation DemoObj

staticDemoObj *instance;

/**

 1. 重写allocWithZone,用dispatch_once实例化一个静态变量

 2. 写一个+sharedXXX方便其他类调用

 */

// iOS中,所有对象的内存空间的分配,最终都会调用allocWithZone方法

// 如果要做单例,需要重写此方法

// GCD提供了一个方法,专门用来创建单例的

+ (id)allocWithZone:(struct_NSZone *)zone

{

   staticDemoObj *instance;

    

    // dispatch_once是线程安全的,onceToken默认为0

   staticdispatch_once_t onceToken;

    // dispatch_once宏可以保证块代码中的指令只被执行一次

   dispatch_once(&onceToken, ^{

        //在多线程环境下,永远只会被执行一次,instance只会被实例化一次

        instance = [superallocWithZone:zone];

    });

    

   return instance;

}


+ (instancetype)sharedDemoObj

{

    //如果有两个线程同时实例化,很有可能创建出两个实例来

//    if (!instance) {

//        // thread 1 0x0000A

//        // thread 2 0x0000B

//        instance = [[self alloc] init];

//    }

//    // 第一个线程返回的指针已经被修改!

//    return instance;

   return [[selfalloc]init];

}


@end





0 0
原创粉丝点击