ios中最常见的单例是UIApplication
单例实现的步骤:
1,重写allocWithZone方法:
allocWithZone方式是对象分配内存空间时,最终会调用的方法,重写该方法,控制它只分配一次内存空间。
2,提供一个名为sharedXXX的类方法,方便其他类获取单例对象。
单例的优点:
保证一个类在应用程序中只有一个实例对象。
单例的缺点:
单例对象一旦建立,对象指针是保存在静态区的,单例对象在堆中分配的内存空间,会直到应用程序终止后才会被释放。
注意:只有在确实需要保证实例对象的唯一性,才考虑使用单例,不要滥用单例。
接下来的几段代码具体演示了单例的实现:
//
// JLSingleTon.h
// 04-单例
//
// Created by Mac on 15-4-4.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import
@interface JLSingleTon : NSObject
+ (instancetype)sharedSingleTon;
@end
//
// JLSingleTon.m
// 04-单例
//
// Created by Mac on 15-4-4.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import "JLSingleTon.h"
@implementation JLSingleTon
/**
* 在ios中,所有对象的内存空间的分配,最终都会调用allocWithZone方法
如果要实现单例,需要重写此方法。
GCD提供了一个方法,专门用来创建单例
*/
+ (id)allocWithZone:(struct _NSZone *)zone{
static JLSingleTon *instance;
static dispatch_once_t onceToken;
// 使用dispatch_once是为了保证 “instance = [super allocWithZone: zone];”
// 这句代码即使在多线程的情况下也只执行一次。
dispatch_once(&onceToken, ^{
instance = [super allocWithZone: zone];
});
return instance;
}
/**
* 提供一个sharedXXX方法方便获取单例对象
*/
+ (instancetype)sharedSingleTon{
return [[self alloc] init];
}
@end
//
// JLViewController.m
// 04-单例
//
// Created by Mac on 15-4-4.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import "JLViewController.h"
#import "JLSingleTon.h"
@interface JLViewController ()
@end
@implementation JLViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// 获取单例对象
JLSingleTon *s1 = [[JLSingleTon alloc] init];
JLSingleTon *s2 = [[JLSingleTon alloc] init];
JLSingleTon *s3 = [JLSingleTon sharedSingleTon];
JLSingleTon *s4 = [JLSingleTon sharedSingleTon];
NSLog(@"s1的内存地址:%p", s1);
NSLog(@"s2的内存地址:%p", s2);
NSLog(@"s3的内存地址:%p", s3);
NSLog(@"s4的内存地址:%p", s4);
// 由打印结果可知:s1,s2,s3,s4是同一个对象。
}
@end