iOS开发之单例模式

本文详细介绍了单例模式在iOS开发中的应用,包括其作用、使用场合及具体实现方法。通过一个具体的AudioPlayer类示例,展示了如何创建单例类并确保在程序运行过程中仅存在一个实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式的意思就是这个类只有一个实例,这个类就是单例类。在iOS中有不少都是单例NSNull,NSFileManager ,UIApplication,NSUserDefaults ,UIDevice,还有一些第三方也有能用到了这种设计模式例如Afhttpmanger。。。

(1)单例模式的作用 :可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。

(2)单例模式的使用场合:在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),应该让这个类创建出来的对象永远只有一个。 

实现思路:

  1.   创建一个一个全局的static的实例   static id _instance;
  2.   提供1个类方法让外界访问唯一的实例
  3.   重写allocWithzone:方法,控制内存分配。因为alloc内部会调用该方法,每次调用allocWithzone:方法,系统都会创建一块新的内存空间。
  4.   实现copyWithZone:方法  
    //
    //  AudioPlayer.m
    //  单例
    //
    //  Created by 两好三坏 on 16/2/21.
    //  Copyright © 2016年 ;. All rights reserved.
    //
     
    #import "AudioPlayer.h"
     
    @interface AudioPlayer ()<NSCopying>
     
    @end
     
    @implementation AudioPlayer
     
    //创建一个一个全局的static的实例   static id _instance;
     
    static id _instance;
     
    //提供1个类方法让外界访问唯一的实例
     
    +(instancetype)shareAudioPlayer{
         
        static dispatch_once_t onceToken;
         
        dispatch_once(&onceToken, ^{
         
            _instance = [[self alloc] init];
     
        });
         
        return _instance;
    }
     
    //重写allocWithzone:方法,控制内存分配。因为alloc内部会调用该方法,每次调用allocWithzone:方法,系统都会创建一块新的内存空间。
     
    +(instancetype)allocWithZone:(struct _NSZone *)zone{
     
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _instance = [super allocWithZone:zone];
        });
        return _instance;
    }
     
    //实现copyWithZone:方法
     
    -(id)copyWithZone:(NSZone *)zone{
        return _instance;
    }
     
     
     
    @end
    在控制其中创建单例类的对象,打印地址:
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    - (void)viewDidLoad {
        [super viewDidLoad];
     
            AudioPlayer *player1 = [AudioPlayer shareAudioPlayer];
     
            AudioPlayer *player2 = [[AudioPlayer alloc] init];
         
            AudioPlayer *player3 = [AudioPlayer new];
         
            AudioPlayer *player4 = [player1 copy];
         
        NSLog(@"%p,%p,%p,%p",player1,player2,player3,player4);
         
    }
     
     
    //打印结果
    2016-02-21 23:27:13.990 单例[2847:329685] 0x7fb6e3e080a0,0x7fb6e3e080a0,0x7fb6e3e080a0,0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值