16、类别、扩展与通知

        Catrgory & Extension

  • Category 给原有的类扩展特有的方法;
  • Extension 可以扩展变量、属性,可以改写属性的读写属性。
  • 什么时候使用?

注意,下面的代码示例是在 BLDemo2 当中进行的,即dragonView
  如何给类扩充方法呢(自己创建的类,可以直接在里面创建方法很方便。一般使用 Category 都是给看不到源码的库),新创建一个OC文件,类型为 Category ,这里命名为 URL,Class 这里选择 NSString 。

category.jpg

  创建出来之后它的命名方式很独特,首先由 .h 和 .m 文件,其次名称是 NSString+URL 。 在新创建的类中创建一个例子(仅仅是举例), .h 文件中:

#import <Foundation/Foundation.h>

@interface NSString (URL)

- (BOOL)isURL;

@end

  在 .m 文件中写明方法:

#import "NSString+URL.h"

@implementation NSString (URL)

- (BOOL)isURL
{
    if ([self hasPrefix:@"http://"]) {
        return YES;
    }

    return NO;
}

@end

  如果以后真的需要判断是不是URL,这样的方法是不行的,还需要通过比如使用正则表达式等方法。
  接下来尝试使用 Category 添加的方法,在 ViewController.m 中先导入 #import "NSString+URL.h":

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *url = @"www.baidu.com";
    if ([url ifURL]) {
        NSLog(@"是一个网址");
    } else {
        NSLog(@"不是一个网址");
    }
}

  关于 Extension 增加成员变量就更佳地方便,可以直接在 ViewController.m 中操作:

@interface ViewController ()
{
    BLDragonView *_dragonView1;
}

// 增加属性就是这样操作
@property(nonatomic, retain)BLDragonView *dragonView;    


@end

  这样的好处是在 ViewController 这个类中可以在任何地方对 _dragonView1 进行访问。
  关于 Extension 改写属性的读写属性,比如在你在一个类的 头文件声明了一个 NSString 类型的变量,并且只是具有 readonly 的特性,对外开发,但是后来你又希望把它改成对内可读写的,这时就可以在实现文件中通过 Extension 改变它的属性。


        NSNotification

  • 什么是通知?
      当发生某件事情之后,将消息发送给所有的对象,对象收到通知后,就会进行相应的操作。代理 “主要” 是一对一的形式,通知一般为1对多。
  • 什么时候用?
  • 怎么用?

  通知的例子可以在 BLDragonView.m 中操作:

- (void)forwardButtonClicked:(id)sender
{
    .......
    
    NSDictionary *dic = @{@"name":@"123456", @"time":@"08:30"};
    NSNotification *notification = [[NSNotification alloc] initWithName:@"BLDragonViewNotification"
                                                                 object:nil
                                                                   user:dic];
    [[NSNotificationCenter defaultCenter] postNotification:notification];
     // 通知类头一个通知中心,固定在此处发送信息

    // 使用异步线程处理通知,在通知多并且希望不阻塞主线程的情况下
    [[NSNotificationQueue defaultQueue] enqueueNotification:notification
                                               postingStyle:NSPostNow
                                               coalesceMask:NSNotificationNoCoalescing        // 合并类型意思是用什么方式将多个通知合并到一个通知,老师推荐是不合并
                                                   forModes:nil]    // 模式一般传nil
}

  如上通知就发送出去了,现在需要有类来接收通知,我们让 ViewController 类来接收,在 .m 文件中:

- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self     //添加一个观察者  由我自己来检测这个通知
                                             selector:@selector(receiveDragonViewNotification:)         // 收到这个通知之后我该做什么
                                                 name:@“BLDragonViewNotification:”         // 通知的名字,注意这个名字一定是你发出的通知的名字,一一匹配
                                               object:nil       // 意思是要接哪一个对象的通知,  如果是接所有对象的话,就填 nil
}

// 然后需要实现接收到通知后的方法
- (void)receiveDragonViewNotification:(NSNotification *)notification
{
    NSDictionary *userInfo = notification.userInfo;
    NSLog(@"time is %@", [userInfo valueForKey:@"time"]);
}
......

  然后运行应用后,点击前进按钮,就会发出通知, ViewController 类酒会接收到通知,然后打印出 key “time” 的键值。
  为了显示通知一对多的特性,我们可以将接收通知在别的类中实现,然后实现相应的接收到通知后的方法。
  需要注意的一点是,因为接收监听是系统方法,当 ViewController 类被释放之后,这个监听还是没有被释放,并且类没有了就收不到信息了,这样应用继续运行是会导致崩溃的。一般这时,就会运用到 dealloc 方法。如何移出通知呢?在 ViewController.m 中:

- (void)dealloc
{
    // [[NSNotificationCenter defaultCenter] removeObserver:self name: object:(id)];   因为一般这个类中或许需要监听很多,所以方便效率起见,会删除所有,会如下:
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

  一定需要注意和掌握这个方法,很多初学者都会只设置监听,却不移除,就会有可能在以后造成应用的崩溃。
  还需要注意,通知的发出嗬监听是同步的,意思就是例如当你发出非常多的通知,很多类就会一个一个地去监听,做不了其他事情,如果接受完毕需要10分钟,就代表将阻塞主线程10分钟。(有时候应用用着用着就不动了,这很有可能就是主线程被阻塞掉了)所以当你有非常多的通知需要发送时,尽量不要在主线程中使用,使用异步的方法(看第五个代码段最下面的代码)。最后的效果是一样的,就是不会造成阻塞主线程,一般情况下会使用post,根据具体情况选择。


OC语法完成,ok!(后续学习查漏补缺~)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容