ios-day19-04(ios中如何实现单例)


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值