iOS學(xué)習(xí)筆記-單例

1.系統(tǒng)中常用單例

[[UIApplication sharedApplication] statusBarStyle];
    
[NSNotificationCenter defaultCenter];
    
[NSUserDefaults standardUserDefaults];
    
[NSFileManager defaultManager];

單例模式中近顷,一般用于管理某對(duì)象持有資源鞋喇,可以全局共享窃页。
大部分使用單例模式共享信息啤覆。

2.單例使用

2.1.創(chuàng)建

2.1.1常規(guī)方式

聲明一個(gè)靜態(tài)變量持有對(duì)象

static ManageViewController *center = nil;
    
if (center == nil) {
    center = [[ManageViewController alloc] init];
}
    
return center;

存在問題:可能AppDlegate與ViewController訪問時(shí)徙鱼,同時(shí)進(jìn)入center = [[ManageViewController alloc] init];

2.1.2.使用dispatch_once 避免上述問題(最佳)
    static ManageViewController *center = nil;
    
    static dispatch_once_t predicate;
    
    dispatch_once(&predicate, ^{
        
        center = [[ManageViewController alloc] init];
        
    });
    
    return  center;
2.1.3.使用initialize方法

每個(gè)類調(diào)用任意方法時(shí)宅楞,都會(huì)先調(diào)用initialize

+(void)initialize{
    
    static ManageViewController *center = nil;
    
    if (self == [ManageViewController class]) {
        
        center = [[ManageViewController alloc] init];
    }
    
}

2.2.創(chuàng)建單例注意

2.2.1防止其他類調(diào)用
+(instancetype)manageCenter{
    
    static dispatch_once_t predicate;
    
    dispatch_once(&predicate, ^{
        
        center = (ManageViewController *)@"ManageViewController";
        
        center = [[ManageViewController alloc] init];
        
    });
    
    //防止子類使用
    
    NSString *classString = NSStringFromClass([self class]);//獲取當(dāng)前類名
    
    if ([classString isEqualToString:@"ManageViewController"] == NO) {
        
        NSParameterAssert(nil);//如果不符合,此處崩潰提示:Invalid parameter not satisfying:nil
    }
    
    return  center;
}
2.2.2.保證只有一個(gè)實(shí)例對(duì)象

一個(gè)單例類作為管理中心袱吆,系統(tǒng)開銷很大咱筛。實(shí)例化一個(gè)對(duì)象,消耗很大杆故。

重寫init方法

+(instancetype)manageCenter{
    
    static dispatch_once_t predicate;
    
    dispatch_once(&predicate, ^{
        
        center = (ManageViewController *)@"ManageViewController";
        
        center = [[ManageViewController alloc] init];
        
    });
    
    //防止子類使用
   
    NSString *classString = NSStringFromClass([self class]);//獲取當(dāng)前類名
    
    if ([classString isEqualToString:@"ManageViewController"] == NO) {
        
        NSParameterAssert(nil);
    }
    
    return  center;
}
-(instancetype)init{
    
    NSString *string = (NSString *)center;

    //判斷string是否為字符串類型以及是否等于給定字符串
    if ([string isKindOfClass:[NSString class]] == YES && [string isEqualToString:@"ManageViewController"]) {
        self = [super init];
        
        if (self) {
        
           //防止子類使用
            
            NSString *classString = NSStringFromClass([self class]);
            
            if ([classString isEqualToString:@"ManageViewController"] == NO) {
                
                NSParameterAssert(nil);
            }
            
        }
        return self;
    }else{
        return nil;
    } 
   
}

若是子類執(zhí)行alloc init方法迅箩,此時(shí)center值為空,不符合if條件处铛,返回空饲趋。
執(zhí)行manageCenter方法時(shí),單例對(duì)象(center)指向字符串撤蟆。開始執(zhí)行init奕塑,符合判斷條件,實(shí)例化對(duì)象家肯。而之后執(zhí)行alloc init時(shí)龄砰,center值變?yōu)镸anageViewController值,不符合if中判斷條件讨衣,返回nil换棚。

3.本地存儲(chǔ)優(yōu)化

使用第三方“FastCoder”.也可使用官方方法(遵守NSCoding協(xié)議) :

- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder*)aDecoder; 
3.1.用單例設(shè)計(jì)存儲(chǔ)數(shù)據(jù)接口,用單例接口隔離實(shí)現(xiàn)細(xì)節(jié)

StoreValue.m中

+(ManageValue *)sharedInstance{
    
    static dispatch_once_t predicate;
    
    dispatch_once(&predicate, ^{
        
        manageValue = (ManageValue *)@"manage";
        manageValue = [[ManageValue alloc] init];
        
    });
    
    //防止子類使用
    
    NSString *classString = NSStringFromClass([self class]);
    
    if ([classString isEqualToString:@"ManageValue"] == NO) {
        
        NSParameterAssert(nil);
    }
    
    return manageValue;
    
}

//保證只有一個(gè)實(shí)例反镇,重寫init 方法
-(instancetype)init{
    
    NSString *string = (NSString *)manageValue;
    
    if ([string isKindOfClass:[NSString class]] == YES && [string isEqualToString:@"manage"]) {
        self = [super init];
        
        if (self) {
            
            //防止子類使用
            
            NSString *classString = NSStringFromClass([self class]);
            
            NSLog(@"%@",classString);
            
            if ([classString isEqualToString:@"ManageValue"] == NO) {
                
                NSParameterAssert(nil);
            }
            
        }
        
        return self;
    }else{
        
        return nil;
    }
    
    
}

-(void)storeValue:(id)value withKey:(NSString *)key{
    
    //value固蚤、key值不能為空
    NSParameterAssert(value);
    NSParameterAssert(key);
    
    //value值轉(zhuǎn)化為NSData,后進(jìn)行存儲(chǔ)
    NSData *data = [FastCoder dataWithRootObject:value];
    
    if (data) {
        
        [[NSUserDefaults standardUserDefaults] setObject:data forKey:key];
        
    }
}

-(id)valueWithKey:(NSString *)key{
    
    NSParameterAssert(key);
    
    NSData *data = [[NSUserDefaults standardUserDefaults] valueForKey:key];
    
    return [FastCoder objectWithData:data];
}

測(cè)試一下:
ViewController.m中

    StaffModel *model = [[StaffModel alloc] init];
    
    model.name = @"AA";
    
    model.salary = @"1000";
    
    ManageValue *value = [ManageValue sharedInstance];
    
    //存值
    [value storeValue:model withKey:@"data"];
    
    StaffModel *temp = [[StaffModel alloc] init];
    
    //取值    
    temp = [value valueForKey:@"data"];
    
    NSLog(@"%@",temp.name);

輸出得到值歹茶。

3.2.在單例提供的接口上實(shí)現(xiàn)上層封裝

好處:
把實(shí)現(xiàn)細(xì)節(jié)隔離夕玩。如果要修改存儲(chǔ)方案你弦,只需要修改實(shí)現(xiàn)方法中的細(xì)節(jié)。改動(dòng)少燎孟。

創(chuàng)建一個(gè)分類禽作,添加方法

-(void)storeValueByKey:(NSString *)key{
    
    [[ManageValue sharedInstance] storeValue:self withKey:key];
    
}

+(id)getValueWithKey:(NSString *)key{
    
    return [[ManageValue sharedInstance] valueForKey:key];
    
}

ViewController.m中

[model storeValueByKey:@"data"];
    
StaffModel *temp = [StaffModel getValueWithKey:@"data"];
    
NSLog(@"%@",temp.name);

聲明:參考網(wǎng)絡(luò)資源,若侵權(quán)揩页,請(qǐng)告知领迈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市碍沐,隨后出現(xiàn)的幾起案子狸捅,更是在濱河造成了極大的恐慌,老刑警劉巖累提,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尘喝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡斋陪,警方通過查閱死者的電腦和手機(jī)朽褪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來无虚,“玉大人缔赠,你說我怎么就攤上這事∮烟猓” “怎么了嗤堰?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)度宦。 經(jīng)常有香客問我踢匣,道長(zhǎng),這世上最難降的妖魔是什么戈抄? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任离唬,我火速辦了婚禮,結(jié)果婚禮上划鸽,老公的妹妹穿的比我還像新娘输莺。我一直安慰自己裸诽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布崭捍。 她就那樣靜靜地躺著,像睡著了一般殷蛇。 火紅的嫁衣襯著肌膚如雪实夹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天粒梦,我揣著相機(jī)與錄音匀们,去河邊找鬼缴淋。 笑死泄朴,一個(gè)胖子當(dāng)著我的面吹牛钟沛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼悠鞍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了模燥?” 一聲冷哼從身側(cè)響起涧窒,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤心肪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后纠吴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硬鞍,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年戴已,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了固该。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糖儡,死狀恐怖伐坏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情握联,我是刑警寧澤桦沉,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布每瞒,位于F島的核電站,受9級(jí)特大地震影響纯露,放射性物質(zhì)發(fā)生泄漏剿骨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一埠褪、第九天 我趴在偏房一處隱蔽的房頂上張望浓利。 院中可真熱鬧,春花似錦钞速、人聲如沸贷掖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苹威。三九已至,卻和暖如春遵班,著一層夾襖步出監(jiān)牢的瞬間屠升,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工狭郑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腹暖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓翰萨,卻偏偏與公主長(zhǎng)得像脏答,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子亩鬼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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