iOS單例清除

iOS開發(fā)中最常見的設(shè)計(jì)模式就是單例模式,簡單,好用,要是不會單例模式感覺都不好意思出門和人打招呼,最近在單例上踩了一個(gè)坑,使用單例的過程中,不需要的時(shí)候需要清除,不然原始數(shù)據(jù)值會一直存在,先來看一段簡單的單例代碼:


static Book *sharedBook;
static dispatch_once_t   onceToken;

@implementation Book

+ (instancetype)sharedInstance {
    dispatch_once(&onceToken, ^{
        sharedBook = [[self alloc] init];
        sharedBook.defaultValue=@"defaultValue";
    });
    return sharedBook;
}

@end

關(guān)于深拷貝和淺拷貝不在本文討論范圍,如果新建一個(gè)單例,我們應(yīng)該如何清除呢?正常的來看設(shè)置nil不就行了嗎,那么就設(shè)置為nil:

    Book *book = [Book sharedInstance];
    book.bookName = @"FlyElephant";
    NSLog(@"書籍名稱:%@--Deafult:%@", book.bookName, book.defaultValue);
    
    book = nil;
    NSLog(@"書籍名稱:%@--Deafult:%@", book.bookName, book.defaultValue);

輸出結(jié)果:

**2016-06-01 19:17:15.711 FlyElephant[19699:256687] ****書籍名稱****:FlyElephant--Deafult:defaultValue**
**2016-06-01 19:17:15.731 FlyElephant[19699:256687] ****書籍名稱****:(null)--Deafult:(null)**

上面已經(jīng)滿足了我們的需求,但是設(shè)置nil,你之后如果要重新初始化呢:

    Book *book = [Book sharedInstance];
    book.bookName = @"FlyElephant";
    NSLog(@"書籍名稱:%@--Deafult:%@", book.bookName, book.defaultValue);
    
    book = nil;
    NSLog(@"書籍名稱:%@--Deafult:%@", book.bookName, book.defaultValue);
    
    book = [Book sharedInstance];
    NSLog(@"書籍名稱:%@--Deafult:%@", book.bookName, book.defaultValue);

輸出的結(jié)果有可能跟你預(yù)想的不一樣:

**2016-06-01 19:17:15.711 FELabel[19699:256687] ****書籍名稱****:FlyElephant--Deafult:defaultValue**
**2016-06-01 19:17:15.731 FlyElephant[19699:256687] ****書籍名稱****:(null)--Deafult:(null)**
**2016-06-01 19:17:15.731 FlyElephant[19699:256687] ****書籍名稱****:FlyElephant--Deafult:defaultValue**

如果有疑惑可以測試接下來的代碼:

    Book *book = [Book sharedInstance];
    book.bookName = @"FlyElephant";
    NSLog(@"地址:%@--書籍名稱:%@--Deafult:%@", book, book.bookName, book.defaultValue);
    
    book = nil;
    NSLog(@"地址:%@--書籍名稱:%@--Deafult:%@", book, book.bookName, book.defaultValue);
    
    book = [Book sharedInstance];
    NSLog(@"地址:%@--書籍名稱:%@--Deafult:%@", book, book.bookName, book.defaultValue);

測試結(jié)果:

**2016-06-01 19:23:17.061 FlyElephant[19751:259691] ****地址****:<Book: 0x7ffdf0c2a2c0>--****書籍名稱****:FlyElephant--Deafult:defaultValue**
**2016-06-01 19:23:17.062 FlyElephant[19751:259691] ****地址****:(null)--****書籍名稱****:(null)--Deafult:(null)**
**2016-06-01 19:23:17.062 FlyElephant[19751:259691] ****地址****:<Book: 0x7ffdf0c2a2c0>--****書籍名稱****:FlyElephant--Deafult:defaultValue**

代碼中我們可以看出來,設(shè)置為nil之后重新初始化還是會復(fù)用之前的內(nèi)存地址,我們想要單例清除之后,重新初始化時(shí)新的內(nèi)存地址,就是重新初始化:

    Book *book = [Book sharedInstance];
    book.bookName = @"FlyElephant";
    NSLog(@"地址:%@--書籍名稱:%@--Deafult:%@", book, book.bookName, book.defaultValue);
    
    [book clear];
    book = [Book sharedInstance];
    NSLog(@"地址:%@--書籍名稱:%@--Deafult:%@", book, book.bookName, book.defaultValue);

測試結(jié)果:

**2016-06-01 19:28:09.390 FELabel[19798:261774] ****地址****:<Book: 0x7f8740e2b6f0>--****書籍名稱****:FlyElephant--Deafult:defaultValue**
**2016-06-01 19:28:09.390 FELabel[19798:261774] ****地址****:<Book: 0x7f8740c3f9c0>--****書籍名稱****:(null)--Deafult:defaultValue**

clear方法:

 (void)clear {
    onceToken   = 0;
}

最終的解決方案很簡單,踩坑的時(shí)候也苦惱了一段時(shí)間,希望對有需要的人有幫助~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,034評論 25 709
  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡單、最易理解的設(shè)計(jì)模式,也因?yàn)樗暮啙嵰锥琼?xiàng)目中最...
    成熱了閱讀 4,536評論 4 34
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 對自己說請好好活著,多運(yùn)動多微笑。
    Joanna1028閱讀 308評論 0 0
  • 17號到家至現(xiàn)在,像想象中地完成所謂視頻計(jì)劃單后,剩下的只是無邊的空虛或還是什么說不清的東西。壓抑了大半個(gè)月的考試...
    Miss_Dong007閱讀 400評論 0 0

友情鏈接更多精彩內(nèi)容