當前位置:
首頁 > 最新 > 全局單例換一種姿勢使用

全局單例換一種姿勢使用

最近在寫項目中遇到一個問題,是關於單例的問題,一般我們使用單例,其實用起來很簡單,但是在某些場景下,我們目前的使用方式就會出現問題,下面我們來看看。

使用場景

首先來說一下我遇到的使用場景,有一個類,我需要在整個項目工程中,他只能被創建一次,無論用什麼創建方式,他的內存地址都不能更改。

首先按照我們日常的單例使用方式,我們來實現一下。

首先有一個單例類Single

@interface Single : NSObject + (instancetype)sharedInstance; @end @implementation Single + (instancetype)sharedInstance { static dispatch_once_t onceToken; static Single *__single = nil; dispatch_once(&onceToken, ^{ __single = [[Single alloc] init]; }); return __single; } - (instancetype)init { self = [super init]; if (!self) { return nil; } return self; } @end

我們每次獲取這個類使用的時候,直接使用sharedInstance獲取,這樣不用說,獲取出來的肯定是同一個對象

但是現在我的這個類對外提供了一個初始化方法

@interface Single : NSObject @property (nonatomic, copy) NSString *key; + (instancetype)sharedInstance; - (instancetype)initWithKey:(NSString *)key; @end ----------------------------------------------------------------------------- @implementation Single + (instancetype)sharedInstance { static dispatch_once_t onceToken; static Single *__single = nil; dispatch_once(&onceToken, ^{ __single = [[Single alloc] init]; }); return __single; } - (instancetype)init { return [self initWithKey:nil]; } - (instancetype)initWithKey:(NSString *)key { self = [super init]; if (!self) { return nil; } _key = [key copy]; return self; } @end

然後我在需要使用到single的地方這樣來獲取

Single *single1 = [Single sharedInstance]; Single *single2 = [[Single alloc] initWithKey:@"11"];

列印出他們的內存地址

很明顯,我現在得到的是兩個不一樣的對象,我想要獲得完全一樣的對象,怎麼做呢

解決方法

每個對象在初始化的時候,都是先獲取內存地址,而這一步是在方法

+ (instancetype)allocWithZone:(struct _NSZone *)zone;

在我們的init方法中,都是在做一些讓這個對象能滿足我們使用的一些設置

那我想要在整個工程中獲取到唯一的一個實例,我們就可以在這個分配內存的方法中做單例步驟

@implementation Single + (instancetype)sharedInstance { return [[self alloc] init]; } - (instancetype)init { return [self initWithKey:nil]; } - (instancetype)initWithKey:(NSString *)key { self = [super init]; if (!self) { return nil; } _key = [key copy]; return self; } static Single *__single = nil; + (instancetype)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ __single = [super allocWithZone: zone]; }); return __single; } @end

我們再次獲取使用單例時

Single *single1 = [Single sharedInstance]; Single *single2 = [[Single alloc] initWithKey:@"11"]; Single *single3 = [Single sharedInstance]; Single *single4 = [[Single alloc] init];

得到的完全是相同的一個實例

歡迎關注微博:ppsheep_Qian歡迎關注公眾號

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 推酷 的精彩文章:

YI Tunnel「看」一眼即可結賬,傳統零售業迎來「無人店」時代
歡迎來到後 ASO 時代
papi醬將出任分答papi社區社長 79元可入社半年
為什麼 Reddit 選擇了 TypeScript?
為什麼我選擇使用原型工具來代替紙原型

TAG:推酷 |

您可能感興趣

液體貓咪的各種變形姿勢,操作一個比一個騷氣!
各種蔬菜正確保鮮姿勢,別再一股腦兒全扔進冰箱了!
全球階層固化:絕望的另一種姿勢!
單臂划船的姿勢,你需要了解的不止一種
換個姿勢看鎢,這種金屬強硬到能在戰爭中扭轉戰局
解密刷紅包的幾種姿勢
睡覺的姿勢很重要,做到可以預防十種疾病,一種姿勢對應一種病!
哪種排便姿勢最好?
瘦手臂運動圖 這樣做才是正確姿勢
不會擺姿勢?這裡有最全擺姿技巧
你記單詞的姿勢不對
這些動物為什麼死後都一個姿勢?
一口吃掉和換三個姿勢吃掉有啥不一樣?
五一旅行拍照技巧,從穿衣到姿勢表情全在這兒了!
搞笑段子 吵架都要換各種姿勢
投資P2P有三種姿勢,你是哪一種?
最全面的俯卧撐姿勢,揭秘錯誤俯卧撐姿勢,這幾點你要把握好!
單一的動作不僅讓身體受累,還讓精神疲憊!這樣換個姿勢更健康
掌握這幾個姿勢,瘦下來很簡單
漲姿勢 | 如何選擇一條好毛巾?