iOS開發(fā)中最常見的設(shè)計(jì)模式就是單例模式,簡(jiǎn)單响蓉,好用,要是不會(huì)單例模式感覺都不好意思出門和人打招呼哨毁,最近在單例上踩了一個(gè)坑枫甲,使用單例的過程中,不需要的時(shí)候需要清除扼褪,不然原始數(shù)據(jù)值會(huì)一直存在想幻,先來看一段簡(jiǎn)單的單例代碼:
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**
如果有疑惑可以測(cè)試接下來的代碼:
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);
測(cè)試結(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之后重新初始化還是會(huì)復(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);
測(cè)試結(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;
}
最終的解決方案很簡(jiǎn)單蹋订,踩坑的時(shí)候也苦惱了一段時(shí)間,希望對(duì)有需要的人有幫助~