GCD--dispatch_once_t

/*!
 * @function dispatch_once
 *
 * @abstract
 * Execute a block once and only once.
 *
 * @param predicate
 * A pointer to a dispatch_once_t that is used to test whether the block has
 * completed or not.
 *
 * @param block
 * The block to execute once.
 *
 * @discussion
 * Always call dispatch_once() before using or testing any variables that are
 * initialized by the block.
 */
typedef long dispatch_once_t;
void
dispatch_once(dispatch_once_t *predicate,
        DISPATCH_NOESCAPE dispatch_block_t block);

場景:項目中唯一的,且需要全局訪問的對象,我們使用單例啰脚。

#import <Foundation/Foundation.h>

@interface User : NSObject
@property (nonatomic, strong) NSString *job;
+ (User *)sharedInstance;
@end
#import "User.h"

static dispatch_once_t user_onceToken;
@implementation User
+ (User *)sharedInstance {
    static User *user = nil;
    dispatch_once(&user_onceToken, ^{
        user = [[User alloc]init];
    });
    return user;
}
@end
[User sharedInstance].job = @"iOS developer";
NSLog(@"%@====%@",[User sharedInstance],[User sharedInstance].job);//<User: 0x600000018450>====iOS developer

場景:項目中,在退出時谱轨,需要把單例數(shù)據(jù)清空,該怎么做 吠谢?土童?

先簡單的把單例對象設(shè)置 user = nil; 然而根本沒用。
單例的數(shù)據(jù)實際上是 static User *user 這個靜態(tài)變量保存著工坊。
方案一:直接把單例的所有屬性一一清空數(shù)據(jù)献汗。
方案二:單例重新初始化,通過代碼控制dispatch_once的block王污。(我以前一直誤以為是不是dispatch_once_t *predicate罢吃,這個指針初始為空,執(zhí)行一次后非空昭齐,這樣子控制block是否執(zhí)行尿招。)

#import "User.h"

static dispatch_once_t user_onceToken;
@implementation User
+ (User *)sharedInstance {
    static User *user = nil;
    NSLog(@"before: %ld--%p",user_onceToken, &user_onceToken);
    dispatch_once(&user_onceToken, ^{
        NSLog(@"after: %ld--%p",user_onceToken, &user_onceToken);
        user = [[User alloc]init];
    });
    return user;
}
@end

調(diào)用單例的代碼

 [User sharedInstance].job = @"iOS developer";
 NSLog(@"%@====%@",[User sharedInstance],[User sharedInstance].job);

輸出結(jié)果

2018-12-02 07:37:09.284862+0800 dispatch_once_t-Demo[51477:2436486] before: 0--0x1001100f8
2018-12-02 07:37:09.285004+0800 dispatch_once_t-Demo[51477:2436486] after: 768--0x1001100f8
2018-12-02 07:37:09.285141+0800 dispatch_once_t-Demo[51477:2436486] before: -1--0x1001100f8
2018-12-02 07:37:09.285246+0800 dispatch_once_t-Demo[51477:2436486] before: -1--0x1001100f8

發(fā)現(xiàn):
第一次[User sharedInstance],static dispatch_once_t user_onceToken 初始值為0阱驾。
然后進入了block就谜,static dispatch_once_t user_onceToken 變成了768。
第二次調(diào)用[User sharedInstance]啊易,static dispatch_once_t user_onceToken 初始值為-1吁伺,沒有進入block。
第三次調(diào)用[User sharedInstance]租谈,static dispatch_once_t user_onceToken 初始值為-1,沒有進入block捆愁。
而且從頭到位靜態(tài)變量指針沒有發(fā)生變化割去。
猜想:是不是修改static dispatch_once_t user_onceToken;這個靜態(tài)變量的值,就可以控制block是否執(zhí)行昼丑。

#import <Foundation/Foundation.h>

@interface User : NSObject
@property (nonatomic, strong) NSString *job;
+ (User *)sharedInstance;
- (void)deleteUser;
@end
static dispatch_once_t user_onceToken;
@implementation User
+ (User *)sharedInstance {
    static User *user = nil;
    NSLog(@"before: %ld--%p",user_onceToken, &user_onceToken);
    dispatch_once(&user_onceToken, ^{
        NSLog(@"after: %ld--%p",user_onceToken, &user_onceToken);
        user = [[User alloc]init];
    });
    return user;
}

- (void)deleteUser {
    user_onceToken = 0;
}
@end

調(diào)用單例

    [User sharedInstance].job = @"iOS developer";
    NSLog(@"%@====%@",[User sharedInstance],[User sharedInstance].job);

    [[User sharedInstance] deleteUser];
    NSLog(@"%@====%@",[User sharedInstance],[User sharedInstance].job);

輸出結(jié)果

2018-12-02 07:50:46.558717+0800 dispatch_once_t-Demo[51640:2456936] before: 0--0x10e847100
2018-12-02 07:50:46.558891+0800 dispatch_once_t-Demo[51640:2456936] after: 768--0x10e847100
2018-12-02 07:50:46.559008+0800 dispatch_once_t-Demo[51640:2456936] before: -1--0x10e847100
2018-12-02 07:50:46.559091+0800 dispatch_once_t-Demo[51640:2456936] before: -1--0x10e847100
2018-12-02 07:50:46.559624+0800 dispatch_once_t-Demo[51640:2456936] <User: 0x600000012530>====iOS developer
2018-12-02 07:50:46.560110+0800 dispatch_once_t-Demo[51640:2456936] before: -1--0x10e847100
2018-12-02 07:50:46.560254+0800 dispatch_once_t-Demo[51640:2456936] before: 0--0x10e847100 //改為0
2018-12-02 07:50:46.560501+0800 dispatch_once_t-Demo[51640:2456936] after: 768--0x10e847100
2018-12-02 07:50:46.560983+0800 dispatch_once_t-Demo[51640:2456936] before: -1--0x10e847100
2018-12-02 07:50:46.561175+0800 dispatch_once_t-Demo[51640:2456936] <User: 0x604000007f00>====(null)

大功告成呻逆,只需要把dispatch_once_t user_onceToken改成0,就重新初始化User了菩帝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咖城,一起剝皮案震驚了整個濱河市茬腿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宜雀,老刑警劉巖切平,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辐董,居然都是意外死亡悴品,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門简烘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苔严,“玉大人,你說我怎么就攤上這事孤澎〗烨猓” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵覆旭,是天一觀的道長退子。 經(jīng)常有香客問我,道長姐扮,這世上最難降的妖魔是什么絮供? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮茶敏,結(jié)果婚禮上壤靶,老公的妹妹穿的比我還像新娘。我一直安慰自己惊搏,他們只是感情好贮乳,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恬惯,像睡著了一般向拆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酪耳,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天浓恳,我揣著相機與錄音,去河邊找鬼碗暗。 笑死颈将,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的言疗。 我是一名探鬼主播晴圾,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼噪奄!你這毒婦竟也來了死姚?” 一聲冷哼從身側(cè)響起人乓,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎都毒,沒想到半個月后色罚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡温鸽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年保屯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涤垫。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡姑尺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝠猬,到底是詐尸還是另有隱情切蟋,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布榆芦,位于F島的核電站柄粹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏匆绣。R本人自食惡果不足惜驻右,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崎淳。 院中可真熱鬧堪夭,春花似錦、人聲如沸拣凹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚣镜。三九已至爬迟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間菊匿,已是汗流浹背付呕。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留跌捆,地道東北人凡涩。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像疹蛉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子力麸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容