iOS开发篇 - 单例设计模式(下)

简介: 所谓单例就是确保在程序运行过程中只创建一个对象实例,可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类、工具类、以及其他管理类。在iOS开发中,单例模式是非常有用的设计模式

测试


一.  对假单例进行调用


单例写法

//  Singleton.m
//  TestSingleton
//
//  Created by taobaichi on 2017/4/13.
//  Copyright © 2017年 MaChao. All rights reserved.
//
#import "Singleton.h"
static Singleton * _sharedSingleton = nil;
@implementation Singleton
+(Singleton *)sharedInstance
{
    if (_sharedSingleton == nil) {
        _sharedSingleton = [[Singleton alloc]init];
    }
    return _sharedSingleton;
}
@end


  • 调用方法一

//
//  ViewController.m
//  TestSingleton
//
//  Created by taobaichi on 2017/4/13.
//  Copyright © 2017年 MaChao. All rights reserved.
//
#import "ViewController.h"
#import "Singleton.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    [self testSingleton];
}
-(void)testSingleton
{
    Singleton * single1 = [Singleton sharedInstance];
    Singleton * single2 = [Singleton sharedInstance];
    if (single1 == single2) {
        NSLog(@"single1 == single2");
    }
    NSLog(@"single1地址   %@",single1);
    NSLog(@"single2地址   %@",single2);
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end


打印结果

2017-04-13 13:12:27.327 TestSingleton[2515:106202] single1 == single2
2017-04-13 13:12:27.327 TestSingleton[2515:106202] single1地址   <Singleton: 0x6000000147f0>
2017-04-13 13:12:27.327 TestSingleton[2515:106202] single2地址   <Singleton: 0x6000000147f0>


  • 调用方法二:

//
//  ViewController.m
//  TestSingleton
//
//  Created by taobaichi on 2017/4/13.
//  Copyright © 2017年 MaChao. All rights reserved.
//
#import "ViewController.h"
#import "Singleton.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    [self testSingleton];
}
-(void)testSingleton
{
    Singleton * single1 = [[Singleton alloc]init];
    Singleton * single2 = [[Singleton alloc]init];
    if (single1 == single2) {
        NSLog(@"single1 == single2");
    }
    NSLog(@"single1地址   %@",single1);
    NSLog(@"single2地址   %@",single2);
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end


打印结果:

2017-04-13 13:13:47.526 TestSingleton[2529:108124] single1地址   <Singleton: 0x60800001cda0>
2017-04-13 13:13:47.526 TestSingleton[2529:108124] single2地址   <Singleton: 0x60800001cdb0>


可以看到,假单例当用alloc实例化的时候,生成的并不是一个单例,也就是说并不是同一个对象


二. 对真单例无论怎么实例化生成的都是同一个对象


真单例写法

//
//  Singleton.m
//  TestSingleton
//
//  Created by taobaichi on 2017/4/13.
//  Copyright © 2017年 MaChao. All rights reserved.
//
#import "Singleton.h"
static Singleton * _sharedSingleton = nil;
@implementation Singleton
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedSingleton = [super allocWithZone:zone];
    });
    return _sharedSingleton;
}
-(id)init
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedSingleton = [super init];
    });
    return _sharedSingleton;
}
+(instancetype)sharedInstance
{
    return [[self alloc]init];
}
+(id)copyWithZone:(struct _NSZone *)zone
{
    return _sharedSingleton;
}
+(id)mutableCopyWithZone:(struct _NSZone *)zone
{
    return _sharedSingleton;
}
@end


调用

//
//  ViewController.m
//  TestSingleton
//
//  Created by taobaichi on 2017/4/13.
//  Copyright © 2017年 MaChao. All rights reserved.
//
#import "ViewController.h"
#import "Singleton.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    [self testSingleton];
}
-(void)testSingleton
{
    Singleton * single1 = [[Singleton alloc]init];
    Singleton * single2 = [[Singleton alloc]init];
    if (single1 == single2) {
        NSLog(@"single1 == single2");
    }
    NSLog(@"single1地址   %@",single1);
    NSLog(@"single2地址   %@",single2);
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end


打印结果

2017-04-13 13:20:31.480 TestSingleton[2562:111462] single1 == single2
2017-04-13 13:20:31.481 TestSingleton[2562:111462] single1地址   <Singleton: 0x608000012b00>
2017-04-13 13:20:31.481 TestSingleton[2562:111462] single2地址   <Singleton: 0x608000012b00>


相关文章
|
3天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
11天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
32 9
|
7天前
|
设计模式 Swift iOS开发
探索iOS开发:从基础到高级,打造你的第一款App
【10月更文挑战第40天】在这个数字时代,掌握移动应用开发已成为许多技术爱好者的梦想。本文将带你走进iOS开发的世界,从最基础的概念出发,逐步深入到高级功能实现,最终指导你完成自己的第一款App。无论你是编程新手还是有志于扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。让我们一起开始这段旅程吧!
|
10天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
8天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
11天前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
14天前
|
存储 数据可视化 Swift
探索iOS开发之旅:从新手到专家
【10月更文挑战第33天】在这篇文章中,我们将一起踏上一场激动人心的iOS开发之旅。无论你是刚刚入门的新手,还是已经有一定经验的开发者,这篇文章都将为你提供宝贵的知识和技能。我们将从基础的iOS开发概念开始,逐步深入到更复杂的主题,如用户界面设计、数据存储和网络编程等。通过阅读这篇文章,你将获得成为一名优秀iOS开发者所需的全面技能和知识。让我们一起开始吧!
|
20天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
22天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    43
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    50
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    58
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    63
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    58
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    42
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    110
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78
  • 下一篇
    无影云桌面