iOS學(xué)習(xí)之常見的設(shè)計(jì)模式

一离例、單例模式

1.1 概述

單例模式可以保證App在程序運(yùn)行中,一個(gè)類只有唯一個(gè)實(shí)例悉稠,從而做到節(jié)約內(nèi)存宫蛆。
在整個(gè)App程序中,這一份資源是共享的的猛。
提供一個(gè)固定的實(shí)例創(chuàng)建方法耀盗。

1.2 系統(tǒng)為我們提供的單例類有哪些?

UIApplication(應(yīng)用程序?qū)嵗?
NSNotificationCenter(消息中心類)
NSFileManager(文件管理類)
NSUserDefaults(應(yīng)用程序設(shè)置)
NSURLCache(請(qǐng)求緩存類)
NSHTTPCookieStorage(應(yīng)用程序cookies池)

1.3 在哪些地方會(huì)用到單例模式

一般在程序中卦尊,經(jīng)常調(diào)用的類叛拷,如工具類、公共跳轉(zhuǎn)類等岂却,會(huì)采用單例模式
例如:登陸控制器忿薇,網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求,音樂(lè)播放器等一個(gè)工程需要使用多次的控制器或方法淌友。

1.4 單例的初始化

.h聲明方法
+ (SingleCase *)shareSingleCase;

.m實(shí)現(xiàn)
+ (SingleCase *)shareSingleCase {
    static SingleCase *single = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        single = [[self alloc] init];
    });
    //dispatch_once 作用是整個(gè)程序的生命周期中煌恢,僅執(zhí)行一次某一個(gè)block對(duì)象骇陈。
    return single;
}

二震庭、代理模式

2.1 概述

代理模式是一種消息傳遞方式,一個(gè)完整的代理模式包括:委托對(duì)象你雌、代理對(duì)象和協(xié)議器联。

2.2 名稱解釋

協(xié)議:用來(lái)指定代理雙方可以做什么二汛,必須做什么。
委托對(duì)象:根據(jù)協(xié)議指定代理對(duì)象需要完成的事拨拓,即調(diào)用協(xié)議中的方法肴颊。
代理對(duì)象:根據(jù)協(xié)議實(shí)現(xiàn)委托方需要完成的事,即實(shí)現(xiàn)協(xié)議中的方法渣磷。

2.3 應(yīng)用場(chǎng)景

當(dāng)一個(gè)類的某些功能需要由別的類來(lái)實(shí)現(xiàn)婿着,但是又不確定具體會(huì)是哪個(gè)類實(shí)現(xiàn)。

2.4 具體實(shí)現(xiàn)

//委托對(duì)象 NextViewController.h
#import <UIKit/UIKit.h>

@protocol SayDadDelegate <NSObject>
//1.聲明協(xié)議 @required表示必須實(shí)現(xiàn) @optional表示非必須 若沒(méi)有關(guān)鍵詞表示必須實(shí)現(xiàn)
@required
- (void)sayDad:(NSString *)str;

@optional
- (void)saySon:(NSString *)str;

@end

@interface NextViewController : UIViewController

//2.定義代理屬性 ARC下使用weak; MRC下使用assign 防止循環(huán)引用
@property (nonatomic, weak) id <SayDadDelegate> delegate;

@end
//委托對(duì)象 NextViewController.m
    //6.委托方通知代理來(lái)執(zhí)行任務(wù)
    //分別判斷是否設(shè)置代理 和 實(shí)現(xiàn)協(xié)議方法
    if (self.delegate && [self.delegate respondsToSelector:@selector(sayDad:)]) {
        [self.delegate sayDad:@"我就是你爸爸"];
        if ([self.delegate respondsToSelector:@selector(saySon:)]) {
            [self.delegate saySon:@"我就是你兒子"];
        }
    }

//代理對(duì)象 ViewController.m
#import "ViewController.h"
#import "NextViewController.h"

@interface ViewController ()<SayDadDelegate>//4.服從協(xié)議

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NextViewController *next = [[NextViewController alloc] init];
    next.modalPresentationStyle = UIModalPresentationFullScreen;
    //3.設(shè)置代理
    next.delegate = self;
    [self presentViewController:next animated:YES completion:nil];
}

//5.實(shí)現(xiàn)協(xié)議中的方法
- (void)sayDad:(NSString *)str {
    NSLog(@"主界面--- %@", str);
}

- (void)saySon:(NSString *)str {
    NSLog(@"主界面--- %@", str);
}

@end

三醋界、觀察者模式

3.1 概述

定義了一種一對(duì)多的依賴關(guān)系竟宋,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。這個(gè)主題對(duì)象在狀態(tài)發(fā)生變化時(shí)形纺,會(huì)通知所有觀察者對(duì)象丘侠,使它們能夠自動(dòng)更新自己。

3.2 應(yīng)用場(chǎng)景

iOS中的KVO逐样、NSNotication都是觀察者模式蜗字。

3.3 通知機(jī)制

通知機(jī)制與委托機(jī)制不同,前者是”一對(duì)多“的對(duì)象之間的通信脂新,后者是“一對(duì)一”的對(duì)象之間的通信挪捕。在通知機(jī)制中,對(duì)某個(gè)通知感興趣的所有對(duì)象都可以成為接收者争便。

//實(shí)現(xiàn)方式
//發(fā)送通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"RefreshData" object:nil];

//注冊(cè)成為觀察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadData)name:@"RefreshData" object:nil];
//具體實(shí)現(xiàn)
-(void)loadData{
      
}
//移除通知
- (void)dealloc{
 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"RefreshData" object:nil];
}

3.4 KVO機(jī)制

KVO機(jī)制不像通知機(jī)制那樣通過(guò)一個(gè)通知中心觀察所有對(duì)象担神,而是在對(duì)象屬性變化時(shí)將通知直接發(fā)送給觀察者對(duì)象

//監(jiān)測(cè)應(yīng)用程序狀態(tài)變化,appStatus是我們要觀察的對(duì)象的屬性

在AppStatusObserver類中的代碼
@implementation AppStatusObersver
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    
    NSLog(@"%@   %@",keyPath,change[NSKeyValueChangeNewKey]);
}
在appDelagate類中的代碼
@interface AppDelegate ()
@property (nonatomic,strong)NSString *appStatus;
@property (nonatomic,strong)AppStatusObersver *observer;
@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    self.observer = [[AppStatusObersver alloc] init];
    [self addObserver:self.observer forKeyPath:@"appStatus" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:nil];
    self.appStatus = @"launch";
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application {
    self.appStatus = @"inactive";
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    self.appStatus = @"background";
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
   self.appStatus = @"foreground";
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    self.appStatus = @"active";
}

- (void)applicationWillTerminate:(UIApplication *)application {
    self.appStatus = @"terminate";
}
@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末始花,一起剝皮案震驚了整個(gè)濱河市妄讯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酷宵,老刑警劉巖亥贸,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異浇垦,居然都是意外死亡炕置,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門男韧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)朴摊,“玉大人,你說(shuō)我怎么就攤上這事此虑∩醺伲” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵朦前,是天一觀的道長(zhǎng)介杆。 經(jīng)常有香客問(wèn)我鹃操,道長(zhǎng),這世上最難降的妖魔是什么春哨? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任荆隘,我火速辦了婚禮,結(jié)果婚禮上赴背,老公的妹妹穿的比我還像新娘椰拒。我一直安慰自己,他們只是感情好凰荚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布耸三。 她就那樣靜靜地躺著,像睡著了一般浇揩。 火紅的嫁衣襯著肌膚如雪仪壮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天胳徽,我揣著相機(jī)與錄音积锅,去河邊找鬼。 笑死养盗,一個(gè)胖子當(dāng)著我的面吹牛缚陷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播往核,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼箫爷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了聂儒?” 一聲冷哼從身側(cè)響起虎锚,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衩婚,沒(méi)想到半個(gè)月后窜护,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡非春,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年柱徙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奇昙。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡护侮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出储耐,到底是詐尸還是另有隱情羊初,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布弧岳,位于F島的核電站凳忙,受9級(jí)特大地震影響业踏,放射性物質(zhì)發(fā)生泄漏禽炬。R本人自食惡果不足惜涧卵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腹尖。 院中可真熱鬧柳恐,春花似錦、人聲如沸热幔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绎巨。三九已至近尚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間场勤,已是汗流浹背戈锻。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留和媳,地道東北人格遭。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像留瞳,于是被迫代替她去往敵國(guó)和親拒迅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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