首页 > 移动平台 > 详细

iOS开发——单例的实现与使用

时间:2015-12-24 23:55:02      阅读:532      评论:0      收藏:0      [点我收藏+]

       单例在我们开发中是最常用的设计模式,在iOS中也是如此。单例可以保证某个类的实例在程序中是唯一的,便于进行资源和数据的共享。使用的设计原则是单一职责原则。我们来看看在iOS中本身自带的类或者方法哪些使用了单例的模式:

(1)UIAccelerometer类和sharedAccelerometer方法,一般如果方法名中有shared这样的词,就可以认为这是一个可以整个应用程序共享的实例变量,一般是使用了单例。

(2)UIApplication类和sharedApplication方法,我们一般使用该方法来创建全局变量。

(3)NSBundle类和mainBundle方法。

(4)NSFileManager类和defaultManager方法。

(5)NSNotificationCenter类和defaultManager方法。其中NSNotificationCenter也实现了观察者模式。

(6)NSUserDefaults类和defaultUser方法。


今天我们尝试自己来实现一个单例:

(1)新建一个普通的类,假设名字为Singleton.   在Singleton.h中声明一个类方法,到时候使用该类方法(注意:一定是类方法,而不是实例方法)可以创建该类的唯一的一个实例:

#import <Foundation/Foundation.h>

@class Singleton;

@interface Singleton : NSObject
// "+" 表示类的方法,由类调用
+(Singleton *)sharedInstance;

@end

(2)在Singleton.m中需要实现sharedInstance方法和你其他的业务逻辑:

#import "Singleton.h"

// 用static声明一个类的静态实例;
static Singleton *_sharedInstance = nil;

@implementation Singleton

/**
 *  1.使用类方法生成这个类唯一的实例;
 */
+(Singleton *)sharedInstance{
    if (!_sharedInstance) {
        _sharedInstance =[[self alloc]init];
    }
    return _sharedInstance;
}

@end

注意:一定要声明一个static的静态变量。以后创建类的唯一实例就使用sharedInstance方法,而不是使用alloc ,init.


(3)我们使用一个简单的demo来演示一下单例:

#import "RootVC.h"
#import "Singleton.h"

@interface RootVC ()

@end

@implementation RootVC

- (void)viewDidLoad
{
  [super viewDidLoad];

  [self testSigleTon];
}

-(void)testSigleTon
{
  //单例的结果就是,调用类方法,只返回一个共有的对象
  /**
   *  single和single2是同一个对象;
   因为返回的数据是一个静态变量,全局唯一;
   */
  Singleton *single = [Singleton sharedInstance];
  Singleton *single2 = [Singleton sharedInstance];

  if (single == single2) {
    NSLog(@"single == single2");
  }

  NSLog(@"single地址:%@",single);
  NSLog(@"single2地址:%@",single2);


}

@end

(4)输出结果如下:

技术分享


      可以看到,两个对象的内存地址是一样的,表示这两个对象其实是同一个对象,单例也就实现了。这是单例最普遍也是最简单的实现方式,在项目中会经常用到,在不涉及多线程的情况下是完全正确的。但是,我们再多想一想,在多线程开发中,这种实现方式是否安全呢?那么应该如何实现。我会在之后的博客中进行介绍。



github主页:https://github.com/chenyufeng1991  。欢迎大家访问!

最近极客学院Wiki正在进行IT职业技能图谱的制定,我主要负责iOS方向,大家感兴趣的可以一起参加,有问题或者修改可以直接给我发issues或者pull request。https://github.com/chenyufeng1991/skillmap  。


iOS开发——单例的实现与使用

原文:http://blog.csdn.net/chenyufeng1991/article/details/50396987

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!