全局單例換一種姿勢使用
最近在寫項目中遇到一個問題,是關於單例的問題,一般我們使用單例,其實用起來很簡單,但是在某些場景下,我們目前的使用方式就會出現問題,下面我們來看看。
使用場景
首先來說一下我遇到的使用場景,有一個類,我需要在整個項目工程中,他只能被創建一次,無論用什麼創建方式,他的內存地址都不能更改。
首先按照我們日常的單例使用方式,我們來實現一下。
首先有一個單例類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有三種姿勢,你是哪一種?
※最全面的俯卧撐姿勢,揭秘錯誤俯卧撐姿勢,這幾點你要把握好!
※單一的動作不僅讓身體受累,還讓精神疲憊!這樣換個姿勢更健康
※掌握這幾個姿勢,瘦下來很簡單
※漲姿勢 | 如何選擇一條好毛巾?