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 */
  • 相关阅读:
    C#快速开发平台(C/S架构+Winform+DevExpress+FastReport)
    C# Winform C/S系统快速开发框架企业版V4.5已发布,欢迎下载试用
    CSS3 Animation
    CSS3 Transition
    CSS3 Transform
    jQuery 屏蔽鼠标快速经过
    JQ插件jquery.fn.extend与jquery.extend
    font-size单位换算
    js获取客户端操作系统
    js数组的操作
  • 原文地址:https://www.cnblogs.com/sheer-code/p/10088538.html
Copyright © 2011-2022 走看看