zoukankan      html  css  js  c++  java
  • 单例模式(singleton)

    什么是单例模式:(singleton)

    单例模式的意图是类的对象成为系统中唯一的实例,提供一个访问点,供客户类共分享资源

    单例类,必须提供一个接入点(特殊的类方法)

    //  SingletonTools.h
    //  单例模式实现
    //
    //  Created by CloudWalk on 15/9/11.
    //  Copyright (c) 2015年 CloudWalk. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface SingletonTools : NSObject
    @property(nonatomic,assign) int num;
    @property(nonatomic, copy)NSString *s;
    // 单例的类,提供一个接入点
    + (instancetype)shareInstance;
    
    @end
    //  SingletonTools.m
    //  单例模式实现
    //
    //  Created by CloudWalk on 15/9/11.
    //  Copyright (c) 2015年 CloudWalk. All rights reserved.
    //
    
    #import "SingletonTools.h"
    static SingletonTools *instance = nil;
    
    @implementation SingletonTools
    // 单利的接入点方法
    + (instancetype)shareInstance
    {
        @synchronized(self){
        if(instance == nil)
        {
            instance = [[SingletonTools alloc] init];
            return instance;
        }
     }
    return instance; } @end
    //  Person.h
    //  单例模式实现
    //
    //  Created by CloudWalk on 15/9/11.
    //  Copyright (c) 2015年 CloudWalk. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    - (void)run;
    @end
    //
    //  Person.m
    //  单例模式实现
    //
    //  Created by CloudWalk on 15/9/11.
    //  Copyright (c) 2015年 CloudWalk. All rights reserved.
    //
    
    #import "Person.h"
    #import "SingletonTools.h"
    @implementation Person
    - (void)run
    {
        SingletonTools *st = [SingletonTools shareInstance];
        st.num = 100;
        st.s = @"jajf";
        NSLog(@"%d %@",st.num, st.s);
    }
    @end
    //  main.m
    //  单例模式实现
    //
    //  Created by CloudWalk on 15/9/11.
    //  Copyright (c) 2015年 CloudWalk. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Person.h"
    #import "SingletonTools.h"
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Person *p = [Person new];
            [p run];
        }
        return 0;
    }

    复杂的单利 :copy,new,alloc 创建对象,都不会产生新的对象

    //  Person.m
    //  Created by CloudWalk on 15/9/2.
    //  Copyright (c) 2015年 CloudWalk. All rights reserved.
    //
    
    #import "Person.h"
    
    // 变量指向单例对象
    static Person *singletonInstance = nil;
    @implementation Person
    + (id)sharePerson
    {
        // 线程锁 
        @synchronized(self)
        {
            // 创建一个单例实例
            if (singletonInstance == nil) {
                singletonInstance = [[[self class] alloc] init];
            }
        }
        return singletonInstance;
    }
    
    #pragma mark - 下面的方法为了确保只有一个实例对象
    + (id)allocWithZone:(NSZone *)zone
    {
        if (singletonInstance == nil)
        {
            singletonInstance =[super allocWithZone:zone];
        }
        return singletonInstance;
    }
    
    // 实现NSCopying协议
    - (id)copyWithZone:(NSZone *)zone
    {
        return singletonInstance;
    }
    
    - (id)retain
    {
        return singletonInstance;
    }
    
    - (oneway void)release
    {
        
    }
    
    - (id)autorelease
    {
        return singletonInstance;
    }
    
    - (NSUInteger)retainCount
    {
        return UINT_MAX;
    }
    @end
  • 相关阅读:
    EXE中释放文件
    关闭GS选项,解决注入后崩溃
    HDU2516 取石子游戏
    HDU2188 选拔志愿者
    HDU2149 Public Sale
    HDU2147 kiki's game
    HDU1846 Brave Game
    LightOJ1214 Large Division
    POJ2480 Longge's problem
    HDU 5880 Family View
  • 原文地址:https://www.cnblogs.com/1023843587qq/p/4799746.html
Copyright © 2011-2022 走看看