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í)間,希望對有需要的人有幫助~