zoukankan      html  css  js  c++  java
  • iOS 单例模式简单实例

     单例模式主要实现唯一实例,存活于整个程序范围内,一般存储用户信息经常用到单例,比如用户密码,密码在登录界面用一次,在修改密码界面用一次,而使用单例,就能保证密码唯一实例。如果不用单例模式,init 两个的实例的堆栈地址不一样,所以存放的数据的位置也不一样,当其中一个数据改变,另一个数据依然不变。单例模式的代码如下

     .h文件

    #ifndef Singleton_h
    #define Singleton_h
    
    @interface Singleton : NSObject
    @property (nonatomic, copy) NSString *pass;
    + (Singleton *) sharedInstance;
    
    @end

    .m文件

    #import <Foundation/Foundation.h>
    #import "Singleton.h"
    
    @implementation Singleton
    static id sharedSingleton = nil;
    + (id)allocWithZone:(struct _NSZone *)zone
    {
    if (sharedSingleton == nil) {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    sharedSingleton = [super allocWithZone:zone];    
    });
    }
    return sharedSingleton;
    }
    
    - (id)init
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            sharedSingleton = [super init];
        });
        return sharedSingleton;
    }
    
    + (instancetype)sharedInstance
    {
    return [[self alloc] init];
    }
    + (id)copyWithZone:(struct _NSZone *)zone
    {
    return sharedSingleton;
    }
    + (id)mutableCopyWithZone:(struct _NSZone *)zone
    {
    return sharedSingleton;
    }
    
    
    @end

    宏实现单例

    #ifndef Singleton_m_h
    #define Singleton_m_h
    
    // 帮助实现单例设计模式
    
    // .h文件的实现
    #define SingletonH(methodName) + (instancetype)shared##methodName;
    
    // .m文件的实现
    #if __has_feature(objc_arc) // 是ARC
    #define SingletonM(methodName) 
    static id _instace = nil; 
    + (id)allocWithZone:(struct _NSZone *)zone 
    { 
    if (_instace == nil) { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
    _instace = [super allocWithZone:zone]; 
    }); 
    } 
    return _instace; 
    } 
    
    - (id)init 
    { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
    _instace = [super init]; 
    }); 
    return _instace; 
    } 
    
    + (instancetype)shared##methodName 
    { 
    return [[self alloc] init]; 
    } 
    + (id)copyWithZone:(struct _NSZone *)zone 
    { 
    return _instace; 
    } 
    
    + (id)mutableCopyWithZone:(struct _NSZone *)zone 
    { 
    return _instace; 
    }
    
    #else // 不是ARC
    
    #define SingletonM(methodName) 
    static id _instace = nil; 
    + (id)allocWithZone:(struct _NSZone *)zone 
    { 
    if (_instace == nil) { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
    _instace = [super allocWithZone:zone]; 
    }); 
    } 
    return _instace; 
    } 
    
    - (id)init 
    { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
    _instace = [super init]; 
    }); 
    return _instace; 
    } 
    
    + (instancetype)shared##methodName 
    { 
    return [[self alloc] init]; 
    } 
    
    - (oneway void)release 
    { 
    
    } 
    
    - (id)retain 
    { 
    return self; 
    } 
    
    - (NSUInteger)retainCount 
    { 
    return 1; 
    } 
    + (id)copyWithZone:(struct _NSZone *)zone 
    { 
    return _instace; 
    } 
    
    + (id)mutableCopyWithZone:(struct _NSZone *)zone 
    { 
    return _instace; 
    }
    #endif /* Singleton_m_h */
  • 相关阅读:
    Spring 集成 MemCache
    memCachedClient 客户端调用时注意的问题,坑
    二)spring 集成 ehcache jgroups 集群
    三)mybatis 二级缓存,整合ehcache
    四)mybatis 二级缓存 ehcache 常见问题
    都有哪些 cache ?
    【转】高并发的核心技术-幂等的实现方案
    如何学习一门编程语言
    WebService学习记录
    代理
  • 原文地址:https://www.cnblogs.com/sheer-code/p/10088538.html
Copyright © 2011-2022 走看看