單例模式-用其他方式實現

来源:http://www.cnblogs.com/nxz-diy/archive/2016/04/07/5366163.html
-Advertisement-
Play Games

[[XZMusicTool alloc] init]; [XZMusicTool sharedMusicTool]; [tool4 copy]; 以上三種方式都能保證創建出來的對象是同一個. ...


 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4     
 5     [self test];  
 6 }
 7 
 8 - (void)test
 9 {
10         XZMusicTool *tool = [[XZMusicTool alloc] init];
11         XZMusicTool *tool2 = [[XZMusicTool alloc] init];
12         XZMusicTool *tool3 = [XZMusicTool sharedMusicTool];
13         XZMusicTool *tool4 = [XZMusicTool sharedMusicTool];
14     
15         // copy 有可能會產生新的對象
16         // copy方法內部會調用- copyWithZone:
17         XZMusicTool *tool5 = [tool4 copy];
18     
19         NSLog(@"%@ %@ %@ %@ %@", tool, tool2, tool3, tool4, tool5);
20 }        

[[XZMusicTool alloc] init];

[XZMusicTool sharedMusicTool];

[tool4 copy];

以上三種方式都能保證創建出來的對象是同一個.

 

1 /**
2  * 懶漢式
3  */
4 #import <Foundation/Foundation.h>
5 
6 @interface XZMusicTool : NSObject
7 + (instancetype)sharedMusicTool;
8 @end
 1 .
 2 //  懶漢式
 3 
 4 #import "XZMusicTool.h"
 5 
 6 @implementation XZMusicTool
 7 static id _instance;
 8 
 9 /**
10  *  alloc方法內部會調用這個方法
11  */
12 + (id)allocWithZone:(struct _NSZone *)zone
13 {
14     if (_instance == nil) { // 防止頻繁加鎖
15         @synchronized(self) {
16             if (_instance == nil) { // 防止創建多次
17                 _instance = [super allocWithZone:zone];
18             }
19         }
20     }
21     return _instance;
22 }
23 
24 + (instancetype)sharedMusicTool
25 {
26     if (_instance == nil) { // 防止頻繁加鎖
27         @synchronized(self) {
28             if (_instance == nil) { // 防止創建多次
29                 _instance = [[self alloc] init];
30             }
31         }
32     }
33     return _instance;
34 }
35 
36 - (id)copyWithZone:(NSZone *)zone
37 {
38     return _instance;  // 既然可以copy,說明是已經創建了對象。
39 }
40 @end

 

 

1 /**
2  * 餓漢式
3  */
4 #import <Foundation/Foundation.h>
5 
6 @interface XZSoundTool : NSObject
7 + (instancetype)sharedSoundTool;
8 @end
 1 //  餓漢式
 2 
 3 #import "XZSoundTool.h"
 4 
 5 @implementation XZSoundTool
 6 static id _instance;
 7 
 8 /**
 9  *  當類載入到OC運行時環境中(記憶體),就會調用一次(一個類只會載入1次)
10  */
11 + (void)load
12 {
13     _instance = [[self alloc] init];
14 }
15 
16 + (id)allocWithZone:(struct _NSZone *)zone
17 {
18     if (_instance == nil) { // 防止創建多次
19         _instance = [super allocWithZone:zone];
20     }
21     return _instance;
22 }
23 
24 + (instancetype)sharedSoundTool
25 {
26     return _instance;
27 }
28 
29 - (id)copyWithZone:(NSZone *)zone
30 {
31     return _instance;
32 }
33 
34 ///**
35 // *  當第一次使用這個類的時候才會調用
36 // */
37 //+ (void)initialize
38 //{
39 //    NSLog(@"HMSoundTool---initialize");
40 //}
41 @end

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 昨晚在網上看的乾貨,直接分享給大家了,覺得有用的,直接fork吧。 https://github.com/Brances/TimLiu-iOS ...
  • 用GCD實現單例模式的步驟: 步驟1. 創建頭文件 XZSingleton.h,裡面代碼如下: 步驟2. 要實現的單例類,比如 XZDataTool,XZDataTool.h XZDataTool.m代碼分別 如下: ...
  • 一,效果圖。 二,工程圖。 三,代碼。 RootViewController.h RootViewController.m ...
  • 在iOS應用開發中,有三類視圖對象會打開虛擬鍵盤,進行輸入操作,但如何關閉虛擬鍵盤,卻沒有提供自動化的方法。這個需要我們自己去實現。這三類視圖對象分別是UITextField,UITextView和UISearchBar。 這裡介紹一下UITextField中關閉虛擬鍵盤的幾種方法。 (miki西游 ...
  • ​【聲明】 歡迎轉載,但請保留文章原始出處→_→ 生命壹號:http://www.cnblogs.com/smyhvae/ 文章來源:http://www.cnblogs.com/smyhvae/p/3981720.html 聯繫方式:[email protected] 【正文】 一、初識Git: Gi ...
  • 鍵盤的出現於隱藏(解決鍵盤彈出時會覆蓋文本框的問題,代碼實現) #import "ViewController.h" #import "UIView+FrameExtension.h" // 可以自己寫,以後用著方便 #define kDeviceHeight [UIScreen mainScree ...
  • 學習一門新語言最經典的例子就是輸出“Hello World!” 如果你使用過其他語言,那麼看上去是非常的熟悉吧。但比一些c要簡單的多吧 1、不需要導入一些單獨的庫,比如輸入/輸出或字元串處理功能的類庫, 2、不需要在全局範圍內編寫的代碼用於作為入口點程式,所以你不需要 main()函數, 3、不需要 ...
  • 前言:繼上次《IOS開發--微信支付》以來,一直沒有太多時間,更新總結詳細支付這樣的長篇大論,很抱歉。今天,推出支付寶支付的詳細流程。 1、開始下載和查看支付寶支付的Demo。 我們直接進入支付寶的支付平臺參考來進行集成支付寶支付: https://doc.open.alipay.com/doc2/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...