当你不爱我的时候澳门葡京网站平台:

作者:新闻中心
  • 基本概念

    1. 它是一种可以直接通过字符串类型的属性名来访问某个类属性的机制。而不是通过调用Setter、Getter方法访问。

    2. 所有NSObject对象都可以使用KVC。

    3. KVC既支持带有对象值的属性,也支持基本数据类型和结构。基本数据类型会被自动封装和解装。

  • 基本使用

    1. 通过 setValue: forKey: 设置对象的值。

    2. 通过 valueForKey: 获得对象的值。

    3. 通过 setValue: forKeyPath: 设置指定路径的对象值。

    4. 通过 valueForKeyPath: 获得指定路径的对象值。

<p style = "text-indent:2em;font-size = 20px;">在iOS开发过程中,我们经常会听到或者用到KVO,KVC,NSNotificationCenter等,但是很多时候,我们可能没有那么了解,下面让我们来详细了解下他们的概念、用法以及他们之间的关系吧~</p>

KVC


示例代码如下:

本篇博客共分以下几个模块来介绍:

键值编码的基本概念
  1. KVCKeyValue Coding 的简称,它是一种可以直接通过字符串的名字(key)来访问属性的机制。使用该机制不需要调用存取方法和变量实例就可访问对象属性。本质上讲,键-值编码定义了你的程序存取方法需要实现的样式及方法签名。
  2. 在应用程序中实现键-值编码兼容性是一项重要的设计原则。存取方法可以加
    强合适的数据封装,而键-值编码方法在多数情况下可简化程序代码。
  3. 键-值编码方法在 Objective-C 非标准协议(类目)NSKeyValueCoding中被声明,默认的实现方法由 NSObject 提供,所以凡是继承自 NSObject 的类都具备 KVC 功能。
  4. 键-值编码支持带有对象值的属性,同时也支持纯数值类型和结构。非对象参
    数和返回类型会被识别并自动封装/解封。
```objc //Person.h@interface Person : NSObject@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) NSInteger age;@property (nonatomic, strong) Person *girlFriend;@property (nonatomic, copy) NSArray *books;@end``` ```objc - viewDidLoad { [super viewDidLoad]; Person *person = [[Person alloc] init]; NSLog(@"1: %@ - %ld", person.name, person.age); [person setValue:@"Bourne" forKey:@"name"]; [person setValue:@21 forKey:@"age"]; NSLog(@"2: %@ - %ld", [person valueForKey:@"name"], person.age); Person *girl = [[Person alloc] init]; [person setValue:girl forKey:@"girlFriend"]; NSLog(@"3: %@ - %ld", [person valueForKeyPath:@"girlFriend.name"], person.girlFriend.age); [person setValue:@"willYou?" forKeyPath:@"girlFriend.name"]; [person setValue:@20 forKeyPath:@"girlFriend.age"]; NSLog(@"4: %@ - %ld", person.girlFriend.name, person.girlFriend.age);}``` **打印输出** ```2015-04-06 16:49:19.192 KVC-KVO-test[5685:7429728] 1:  - 02015-04-06 16:49:19.193 KVC-KVO-test[5685:7429728] 2: Bourne - 212015-04-06 16:49:19.194 KVC-KVO-test[5685:7429728] 3:  - 02015-04-06 16:49:19.194 KVC-KVO-test[5685:7429728] 4: willYou? - 20``` 
  • 什么是KVC?
  • 什么是KVO?
  • KVC与KVO的关系
  • KVC Collection Operators
  • 什么是NSNotificationCenter?
  • NSNotificationCenter与KVO的比较
  • NSNotificationCenter与Delegate的比较
设置和访问
  • 键/值编码中的基本调用包括 -valueForKey:-setValue:forkey: 这两个
    方法,它们以字符串的形式向对象发送消息,字符串是我们关注属性的关键。

示例1:

BNRAppliance *a = [[BNRAppliance alloc] init];

[a setProductName:@"Washing Machine"];
// 使用 KVC 重写以上代码
 [a setValue:@"Washing Machine" forKey:@"productName"];

[a setVoltage:240];
// 使用 KVC 重写以上代码
[a setValue:[NSNumber numberWithInt:240] forKey:@"voltage"];

 NSLog(@"a is %@",a);
 // 使用 KVC 重写以上代码
 NSLog(@"the product name is %@",[a valueForKey:@"productName"]);

示例2:

Person *jack = [[Person alloc] init];
NSMutableString *name = [[NSMutableString alloc] initWithFormat:@"jack"];
[jack setValue:name forKey:@"name"];
NSLog(@"jack name : %@", [jack valueForKey:@"name"]);
  • 使用KVC,编译器会查找是否存在 settergetter 方法,如果不存在,它将在内部查找名为 _keykey 的实例变量。通过 KVC,可以获取不存在getter方法的对象值,无需通过对象指针直接访问。
  • KVC 能够在没有存取方法的情况下直接存取实例变量。
  • ⚠️非对象类型:当我们通过 setValue:forKey: 设置对象的值,或通过
    valueForKey 来获取对象的值时,如果对象的实例变量为基本数据类型(char、int、float、BOOL)时,我们需要使用 NSNumber 对象对数据进行 封装
  • 一对多关系

    1. 如果向NSArray等集合类型数据所包含的对象发送请求消息,它会查询数组中每个对象来查找这个键值,并返回一个打包后的数组。

    2. 如果想要向数组等集合类型的数据所包含的对象发送赋值消息,它也会查询数组中每个对象来查找这个键值,并赋同一个值。注意:不要企图发送一个数组让她为找到的对象按顺序赋值,这样会报错!

    示例代码如下

    //Book.h@interface Book : NSObject@property (nonatomic, assign) NSInteger price;@end
    
    - setAndGetBooks { Person *person = [[Person alloc] init]; Book *book1 = [[Book alloc] init]; Book *book2 = [[Book alloc] init]; Book *book3 = [[Book alloc] init]; NSArray *myBooks = @[book1, book2, book3]; [person setValue:myBooks forKey:@"books"]; NSLog(@"1: %@", [person valueForKeyPath:@"books.price"]); [person setValue:@1 forKeyPath:@"books.price"]; NSLog(@"2: %@", [person valueForKeyPath:@"books.price"]);}
    

    打印输出

     2015-04-06 17:12:48.256 KVC-KVO-test[5886:7519923] 1: 2015-04-06 17:12:48.257 KVC-KVO-test[5886:7519923] 2: 
    

欢迎访问作者个人博客www.dullgrass.com,更多好的文章与您分享

key路径
  • 除了通过键设置值外,键/值编码还支持指定路径,像文件系统一样。用“点”
    号隔开。
  • 使用 key path 可以一次性遍历复杂的对象表。
  • 注意顺序,第一个想要遍历的对象放在第一个。

示例:
BNRDepartment. manager 指向 BNREmployee. emergencyContact 指向 BNRPerson. phoneNumber

    BNRDepartment *sales = ...;
    BNREmployee *sickEmployee = [sales valueForKey:@"manager"];
    BNRPerson *personToCall = [sickEmployee valueForKey:@"emergencyContact"];
    [personToCall setValue:@"555-606-0842" forKey:@"phoneNumber"];

    // 使用 Key路径 重写以上代码
    BNRDepartment *sales = ...;
    [personToCall setValue:@"555-606-0842"
                forKeyPath:@"manager.emergencyContact.phoneNumber"];

下面就进入正题吧~

一对多的关系

  • 如果向 NSArray 请求一个键值,它实际上会查询数组中的每个对象来查找这个
    键值,然后将查询结果打包到另一个数组中并返回给你。
NSArray *booksArray = [NSArray arrayWithObjects:book1, book2, nil];
[book1 release];
[book2 release];
[book setValue:booksArray forKey:@"relativeBooks"];
NSLog(@"books 2: %@", [book valueForKeyPath:@"relativeBooks.price"]);
  • 基本概念

    1. KVO: Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者。属于一种非正式的 Protocol。

    2. 可以观察任意属性,包括基本数据类型,对一或对多关系。对多关系的观察者将会被告知发生变化的类型,也即使任意发生变化的对象。

  • 使用方法

    1. 注册观察者,指定被观察者的属性。

    2. 实现回调方法,接收变更通知。

    3. 移除观察者身份。

  • 注册观察者

    为了正确接收属性的变更通知,观察者必须首先发送一个 addObserver:forKeyPath:options:context: 消息给被观察者。用以传送需要观察的对象和需要观察的属性的关键路径,选型参数指定了发生变更时提供给观察者的信息,使用 NSKeyValueObservingOptionNew 可以在回调方法中获得旧值,使用 NSKeyValueObservingOptionOld 可以在回调方法中获得新值。

    示例

    [person addObserver:self forKeyPath:@"books.price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
    
  • 回调方法

    当监听属性发生变化时,坚挺着将会收到一条 observeValueForKeyPath: ofObject: change: context: 消息。触发观察的对象、键路径、包含变化细节的字典都会传给观察者。

     -observeValueForKeyPath:(NSString *)keyPath ofObject:object change:(NSDictionary *)change context:context { if([keyPath isEqualToString:@"books.price"]) { NSLog; } } 
    
  • 移除观察者

    你可以发送一条包含观察者,键路径的方法 `` 给被观察的对象,来移除这个观察。注意:注册了观察者就需要手动移除观察者!

    [person removeObserver:self forKeyPath:@"books.price"];
    

1. KVC的概念:<p style = "text-indent:2em;font-size = 20px;">苹果的官方文档描述: KVC(Key-Value-Coding)是一种通过字符串描述而不是通过调用访问方法或者直接使用实例变量的非直接的访问对象属性的机制。</p>

实现简单的运算

NSString *count = [book valueForKeyPath:@"relativeBooks.@count"];
NSLog(@"count : %@", count);
NSString *sum = [book valueForKeyPath:@"relativeBooks.@sum._price"];
NSLog(@"sum : %@", sum);
NSString *avg = [book valueForKeyPath:@"relativeBooks.@avg._price"];
NSLog(@"avg : %@", avg);
NSString *min = [book valueForKeyPath:@"relativeBooks.@min._price"];
NSLog(@"min : %@", min);
NSString *max = [book valueForKeyPath:@"relativeBooks.@max._price"];
NSLog(@"max : %@", max);

<p style = "text-indent:2em;font-size = 20px;">KVC 是观察者模式在Objective-C中的实现之一,它以分类的形式被定义在NSObject中,从协议的角度看,是定义了一套让开发者遵守的规范和使用方法。</p>

KVO


  • 概述

    与KVO不同的是,KVO在属性上通过 K-V 发生改变时,自动调用 observeValueForKeyPath: ofObject: change: context: 方法,而 NSNotification 在需要的时候自行发送通知才调用,且方法自定义。

  • 使用方法

    1. NSNotificationCenter 注册观察者时指定事件,及该事件触发时该执行的 Selector 或 Block

    2. NSNotificationCenter 在某个时机激发事件

      注意:编译器根据这个事件的名字找到之前注册过这个名字的观察者,所以这个名字一般设置成静态属性,保证两次使用是同一个字符串!

    3. 观察者在收到感兴趣的事件时,执行相应的 Selector 或 Block

  • 注册观察者

    使用默认的通知中心,指定观察者、需要接收的通知名称、接收通知时执行的方法,最后一个参数是表示会对哪个发送者对象发出的事件作出响应,nil 时表示接受所有发送者的事件。

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector name:@"NOTIFICATION_NAME" object:nil];
    
  • 激发观察者

    需要指定通知的名称,编译器根据这个事件的名字找到之前注册过这个名字的观察者,还可以指定传给观察者的对象。

    NSObject *test = [[NSObject alloc] init]; [[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFICATION_NAME" object:test]; //或者以下的方式: NSNotification *notification = [NSNotification notificationWithName:@"NOTIFICATION_NAME" object:test]; [[NSNotificationCenter defaultCenter] postNotification:notification];
    
  • 执行事件

    观察者接受到通知后就会执行注册时指定的方法,并获得被观察者传回的对象。

    - action:(NSNotification *)notification { NSLog;} 
    

2. KVC的用途<p style = "text-indent:2em;font-size = 20px;">在Cocoa的MVC框架中,KVC是ViewControler和Model沟通的桥梁。</p>

基本概念
  1. Key Value Observing,直译为:基于键值的观察者。它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察对象的属性被修改后,KVO就会自动通知相应的观察者了。
  2. NSNotification不同,键-值观察中并没有所谓的中心对象来为所有观察者提供变化通知。取而代之地,当有变化发生时,通知被直接发送至处于观察状态的对象。NSObject 提供这种基础的键-值观察实现方法。
  3. 你可以观察任意对象属性,包括简单属性,对一或是对多关系。对多关系的观察者将会被告知发生变化的类型-也就是任意发生变化的对象。
  4. 键-值观察为所有对象提供自动观察兼容性。你可以通过禁用自动观察通知并
    实现手动通知来筛选通知。

声明

  1. 以上内容属于本人整理的笔记,如有错误的地方希望能告诉我,大家共同进步。

  2. 以上内容有些段落或语句可能是本人从其他地方Copy而来,如有侵权,请及时告诉我。

<p style = "text-indent:2em;font-size = 20px;">KVC的基本方法都定义在了NSKeyValueCoding的非正式协议中,如下图所示:(NSObject默认实现了该协议,也就是说OC中几乎所有的对象都支持KVC操作)。</p>

注册观察者

为了正确接收属性的变更通知,观察对象必须首先发送一个
addObserver:forKeyPath:options:context:消息至被观察对象,用以传送观察
对象和需要观察的属性的关键路径,以便与其注册。选项参数指定了发送变更通知时提供给观察者的信息。 使用NSKeyValueObservingOptionOld选项可以将
初始对象值 以变更字典中的一个项的形式提供给观察者。指定
NSKeyValueObservingOptionNew选项可以将新的值以一个项的形式 添加至
变更字典。你可以使用逐位“|”这两个常量来指定接收上述两种类型的值。
示例:

    BNRLogger *logger = [[BNRLogger alloc] init];
    __unused NSTimer *timer =
                [NSTimer scheduledTimerWithTimeInterval:2.0
                                                 target:logger
                                               selector:@selector(updateLastTime:)
                                               userInfo:nil
                                                repeats:YES];

    BNRObserver *observer = [[BNRObserver alloc] init];
    // 无论 lastTime 何时发生变化,都要通知我它改变的新值以及改变之前的旧值
    [logger addObserver:observer
             forKeyPath:@"lastTime"
                options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
                context:nil];

    [[NSRunLoop mainRunLoop] run];

@interface NSObject(NSKeyValueCoding)- (nullable id)valueForKey:(NSString *)key;- setValue:(nullable id)value forKey:(NSString *)key;- (nullable id)valueForKeyPath:(NSString *)keyPath;- setValue:(nullable id)value forKeyPath:(NSString *)keyPath;

接受变更后通知
  • 当对象的一个被观察属性发生变动时,观察者收到一个
    observeValueForKeyPath:ofObject:change:context:消息。所有观察者都必须
    实现这一方法。触发观察通知的对象和键路径、包含变更细节的字典,以及观察者
    注册时提交的上下文指针均被提交给观察者,context可以为任意类型参数。
    示例:
- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary<NSKeyValueChangeKey,id> *)change
                       context:(void *)context {
    NSString *oldValue = [change objectForKey:NSKeyValueChangeOldKey];
    NSString *newValue = [change objectForKey:NSKeyValueChangeNewKey];
    NSLog(@"Observed:%@ of %@ was changed from %@ to %@",
          keyPath,object,oldValue,newValue);
} 

<p style = "text-indent:2em;font-size = 20px;">KVC可以用来访问对象的属性、一对一的关系对象、一对多的关系对象</p>

移除观察者身份
  • 你可以发送一条指定观察方对象和键路径的removeObserver:forKeyPath:
    消息至被观察的对象,来移除一个键-值观察者。(当我们达到目的时)
    示例:
[child removeObserver:self forKeyPath:@"key"];
  1. 访问对象属性:也可以是对象的成员变量,成员变量是私有的也可以访问,属性可以是对象,也可以是数值类型和结构体,非对象类型的参数和返回值会自动封装成NSValue活着NSNumber类型。valueForKey:会返回跟接收者相关的key的值,如果对于指定的key没有访问器或者实例变量,则给自己发送一个valueForUndefineKey:消息,这个方法的默认实现是抛出一个NSUndefinedKeyException
  2. 通过关系访问对象:假设对象person有属性address,属性address有属性city,我们可以通过person来访问city:

[person valueForKeyPath:@"address.city"];

 valueForKeyPath:返回跟接收者相关的键路径的值,对于子系列中任何不遵循KVC的对象,都会收到一个valueForUndefineKey:消息。
  1. 访问集合对象: 可以是可变集合和不可变集合,可变集合与KVO结合,可以实现批量更新的功能。

    dictionaryWithValuesForKeys:会检索数组中所有跟接收者相关的key的值,返回的NSDictionary中包含了数组中所有key的值。

<p style = "text-indent:2em;font-size = 20px;">KVC可以设置属性的值</p>setValue:forKey用来将接收者中相关key的值设置成指定的值。在这个方法的实现中,会将NSValue的值转换成普通的数值然后赋值给属性。<p style = "text-indent:2em;font-size = 20px;">KVV(Key-Value-Validate)键值验证</p>

- validateValue:(inout id *)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;

  1. 观察者模式的基本思想:<p style = "text-indent:2em;font-size = 20px;">观察者模式主要是,通过一个对象来管理所有依赖于它的观察者对象,并在它自身的状态改变时主动通知观察者对象。 目标对象通知观察者通常是通过调用各观察对象所提供的接口方法来实现的.观察者模式比较完美的将目标对象与观察者对象解耦.</p>

  2. KVO 的应用场景:<p style = "text-indent:2em;font-size = 20px;">当一个对象的特定属性改变的时候,需要被通知一个或者多个对象的时候。</p>

  3. KVO 的使用流程:

  • 注册与解除注册

keyPath不可以为nil- addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;- removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;

  • 设置Value

[target setAge:30]; //setter[target setValue:[NSNumber numberWithInt:30] forKey:@"age"]; //setValue:forKey

  • 处理变更通知<p style = "text-indent:2em;font-size = 20px;">观察者需要实现名为 NSKeyValueObserving 的 category 方法来处理收到的变更通知</p>

- observeValueForKeyPath:(NSString *)keyPath ofObject:object change:(NSDictionary *)change context:context;

<p style = "text-indent:2em;font-size = 20px;">当一个观察者需要观察多个对象的同一个keyPath时,可以通过设置context来区分不同的通知。</p>

  1. 属性依赖<p style = "text-indent:2em;font-size = 20px;">简单点说,就是通过观察一个key的值,来观察多个属性的变化,需要对象实现以下几个方法。</p>

keyPathsForValuesAffectingAddress{NSSet *澳门新莆京在线娱乐,set = [NSSet setWithObjects:@"firstName", @"lastName", nil];return set; //这方法使得 Key 之间能够建立依赖关系}//设置属性之间的依赖关系- (NSString *)address{return [NSString stringWithFormat:@"%@%@",self.province,self.street];}

<p style = "text-indent:2em;font-size = 20px;">KVO是基于KVC实现的,只有我们调用KVC去访问key值的时候KVO才会起作用。</p>

  1. KVC 集合操作符的概念:<p style = "text-indent:2em;font-size = 20px;">KVC集合操作符允许在valueForKeyPath:方法中使用key path符号“@”,在一个集合中执行方法。结果可以被返回或者链接。</p>

  2. KVC 集合操作符的类型(根据返回值的类型来分):

  • 简单的集合操作符:返回值是NSString、NSNumber或者NSDate
  • 对象操算符:返回值是一个数组
  • 数组和集合操作符:返回值是一个数组或者集合
  1. 简单的集合操作符
  • @count:返回一个值为集合中对象总数的NSNumber对象
  • @sum: 首先把集合中的每个对象都转换为double类型,然后计算其总,最后返回一个值为这个总和的NSNumber对象
  • @avg: 首先把集合中的每个对象都转换为double类型,然后计算其平均值,最后返回一个值为这个总和的NSNumber对象
  • @max: 使用compare:方法来确定最大值。所以为了让其正常工作,集合中所有的对象都必须支持和另一个对象的比较
  • @min: 和@max一样,但是返回的是集合中的最小值。
  • 使用示例:

products是数组,数组中存放了很多对象,每个对象都有一个price的属性。[products valueForKeyPath:@"@sum.price"];可以用self作为操作符后面的keyPath来获取一个由NSNumber组成的数组或者集合的总值。[@[@1,@2] valueForKey:@"@max.self"];

  1. 对象操作符
  • @distinctUnionOfObjects:获取数组中每个对象的属性的值,放到一个数组中并返回,会对数组去重。
  • @unionOfObjects: 同@distinctUnionOfObjects,但是不去重。
  • 使用示例:

Person *lilei = [[Person alloc] init];lilei.name = @"LiLei";Person *hanMeiMei = [[Person alloc] init];hanMeiMei.name = @"hanMeiMei";NSArray *array = @[lilei, hanMeiMei];NSLog(@"array is %@",[array valueForKeyPath:@"@distinctUnionOfObjects.name"]);输出结果为:2015-11-10 16:08:07.977 TestPro[49746:521302] array is (LiLei,hanMeiMei)

  1. 数组和集合操作符
  • @distinctUnionOfArrays: 获取数组中每个数组中的每个对象的属性的值,放到一个数组中并返回,会对数组去重复。
  • @unionOfArrays:同@distinctUnionOfArrays,但是不去重。
  • @distinctUnionOfSets: 获取集合中每个集合中的每个对象的属性的值,放到一个集合中并返回。
  • 使用示例:

Person *lilei = [[Person alloc] init];lilei.name = @"LiLei";Person *hanMeiMei = [[Person alloc] init];hanMeiMei.name = @"hanMeiMei";NSArray *array = @[lilei, hanMeiMei];NSLog(@"array is %@",[ @[array,array] valueForKeyPath:@"@unionOfArrays.name"]);输出结果为:2015-11-10 16:51:26.137 TestPro[50404:556930] array is (LiLei,hanMeiMei,LiLei,hanMeiMei)

  1. 通知中心的概念:<p style = "text-indent:2em;font-size = 20px;">通知中心是 Foundation 框架的一个子系统,也是一个观察者模式,它向应用程序中注册为某个事件观察者的所有对象广播消息,可以在不同类之间通信的时候使用。</p>
  • 注意当接受到消息后,不想再收到消息了,要把observer删除remove。一般在类销毁的时候remove。
  1. 组成通知中心的两个类:
  • NSNotificationCenter:获取NSNotificationCenter的方法只有一种,即[NSNotificationCenter defaultCenter],并且NSNotificationCenter是一个单例模式,一旦创建,这个通知中心的对象会一直存在于一个应用的生命周期。
  • NSNotification: 这是消息携带的载体,通过它,可以把消息内容传递给观察者。
  1. 通知中心的使用流程:
  • 注册通知:NSNotificationCenter 注册观察者对某个事件感兴趣,及该事件触发时该执行的 Selector 或 Block.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationMethod:) name:@"notificationName" object:nil];参数注释:第一个参数:负责监听的对象第二个参数(@selector(notificationMethod:)):接收到通知之后,监听对象需要执行的方法。第三个参数(@"notificationName"):通知的名称,也是通知的唯一标示,编译器就是通过这个找到通知的。第四个参数:最后一个参数是表示会对哪个发送者对象发出的事件作出响应,nil 时表示接受所有发送者的事件。

  • 发送通知:手动发送消息

[[澳门葡京网站平台,NSNotificationCenter defaultCenter] postNotificationName:@"notificationName" object:test userInfo:@{@"key":@"value"}];参数注释:第一个参数(@"notificationName"):通知的名称,这个名称必须和后面接收通知的名称一致第二个参数:可以传递的一个参数对象第三个参数(@{@"key":@"value"}):可以传递的,与通知相关的信息,

  • 移除通知:在观察者不再接收消息的时候,移除通知

- dealloc{//移除指定的通知,不然会造成内存泄露[[NSNotificationCenter defaultCenter] removeObserver:self name:@"happyValueNotification" object:nil];//移除所有的通知[[NSNotificationCenter defaultCenter] removeObserver:self];}

  1. 相同点:
  • NSNotificationCenter与KVO的实现原理都是观察者模式。用于监听操作
  1. 不同点:
  • KVO只用来监听属性值的变化,这个发送监听的操作是系统控制的,我们控制不了,我们只能控制监听操作,类似于Android中系统发送的广播。</p>
  • 我们可以控制通知的发送监听,可以在任何地方任何时机发送一个通知。类似于Android中开发者自己发送的广播。</p>
  • 通知的使用场景比KVO更为广泛些
  • 通知需要一个发送notification的对象,一般是notificationCenter,来通知观察者。KVO是直接通知到观察对象,并且逻辑非常清晰,实现步骤简单。
  • 总之,KVO操作没有通知灵活。但是KVO也有自己的优点,比如可以记录新旧值,通知就比较麻烦,所以在使用的时候还是具体问题具体分析,一般监听属性值的变化,最好还是用KVO。

<p style = "text-indent:2em;font-size = 20px;">通知比Deleagte可以实现更大跨度的通信机制,可以为两个无引用关系的两个对象进行通信,即事件发出者和响应者可以没有任何耦合关系。</p>

本文由新葡京8455发布,转载请注明来源

关键词: