引用文章

一、KVO

  1、当对象中的某个属性值发生了改变,可以对这些值的观察者做出通知。

  2、接受者(会接收到值发生改变的消息) 必须知道发送者(值将发生改变的那个对象)。

  3、接收者同样还需要知道发送者的生命周期,因为在销毁发送者对象之前,需要取消观察者的注册。


  

二、KVC

  1、简介 

     a) 允许访问 property 的时候使用 string(key) 去标示 property(类型可以为 object || 基本数据类型)。

     b) 在运行时才确定给哪个 property 赋值,则使用。

          valueForKey: @"key"

          setValue:forKey:

  2、获取一个对象的所有 property name and value

#import <objc/runtime.h>

unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList([YourObject class], &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property)];
id propertyValue = [yourObject valueForKey:(NSString *)propertyName]; NSLog(@"Key = %@ Value = %@", propertyName, propertyValue);
}
free(properties);

  3、获取类的所有 private 成员变量的 name and type

#import <objc/runtime.h>

Ivar *vars = class_copyIvarList([YourObject class], &varCount);

        for (int i = 0; i < varCount; i++) {
Ivar var = vars[i]; const char* name = ivar_getName(var);
const char* typeEncoding = ivar_getTypeEncoding(var); NSLog(@"Key = %s Value = %s", name, typeEncoding);
} free(vars);

  

  4、扩展

    参考文章

    a) 通常 Server 返回 Json,最好的做法是返回一个 property 结构和 Json 结构一致的类。例如,

// json file
[
{
"Name": "AAA",
"Age": 11
},
{
"Name": "BBB",
"Age": 22
}
] // Person.h
@property(nonatomic, strong) NSString* name;
@property(nonatomic, assign) NSInteger age; - (id)initWithDictionary:(NSDictionary*)jsonObject;
- (NSString*)print; // person.m
- (id)initWithDictionary:(NSDictionary*)jsonObject {
self = [super init]; if (self) {
[self setValuesForKeysWithDictionary:jsonObject];
} return self;
}

  

     b) 如果 json 中的 key值 和 property name 不一致,需要重载如下的方法,分别对不匹配的 property 赋值

- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
if ([key isEqualToString:@"id"])
self.identifier = value; else if ([key isEqualToString:@"Tel"])
self.telephone = value; else
[super setValue:value forKey:key];
}

    c) 对于内嵌 json 也转换为自定义对象, 需要重载下面的方法,对特殊的 key 做处理

// json file
{
"id": "001",
"Name": "Eileen",
"Age": 25,
"Tel": "123456",
"Purchase": [
{
"ProductName": "Apple",
"Price": 45
},
{
"ProductName": "Pear",
"Price": 100
}
]
}, // People.m
- (void)setValue:(id)value forKey:(NSString *)key {
if ([key isEqualToString:@"Purchase"]) {
for (NSDictionary* eachProductDict in value) {
Product* eachProduct = [[Product alloc] initWithDictionary:eachProductDict];
[self.purchase addObject:eachProduct];
} } else
[super setValue:value forKey:key];
}

  

  d) valueForKeyPath 传递关系 (DSL 参考文章)

    一般用在 NSArray 和 NSSet

    Note: It is not currently possible to define your own collection operators.

// 返回 name 首字母为大写的数组
NSArray* array = [personObjList valueForKeyPath:@"name.capitalizedString"]; // 算法运算符 @sum @min @max @avg @count
NSNumber* sumOfAge = [personObjList valueForKeyPath:@"@sum.age"];
[array valueForKeyPath:@"@count"]
[array valueForKeyPath:@"@max.self"];

// collection oprator

// collection: @distinctUnionOfObjects, @unionOfObjects (对 array 里面元素对比)
NSArray* array = @[array1, array2, array2];
[array valueForKeyPath:@"@distinctUnionOfObjects.self"]
// array: @distinctUnionOfArrays, @unionOffArrays (array1, array2 里面元素对比)
[@[array1, array2] valueForKeyPath:@"@distinctUnionOfArrays.self"]
[@[array1, array2] valueForKeyPath:@"@unionOfArrays.self"]
 
// set: @distinctUnionOfSets, @unionOfSets

[@[set1, set2]valueForKeyPath:@"@distinctUnionOfSets.self"]

[@[set1, set2]valueForKeyPath:@"@unionOfSets.self"]

  


三、Notification

  1、在不相关的两部分代码中要想进行消息传递。

  2、通知可以用来发送任意的消息。

  3、发送者和接收者双方并不需要相互知道。这种消息传递机制是单向的,作为接收者是不可以回复消息的。

四、Delegate

  1、定制某个对象的行为,并且可以收到某些确定的事件。

  2、消息的发送者需要知道消息的接收者(delegate),反过来就不用了。

  3、可以通过返回值的形式给发送者做出回应。

  注意:过渡使用delegation也有一定的风险,如果两个对象的耦合程度比较紧密,相互之间不能独立存在,那么此时就没有必要使用delegate协议了,针对这种情况,对象之间可以知道相互间的类型,进而直接进行消息传递。

五、Block

  1、block可以满足用delegation实现的消息传递机制。

  2、如果为了让代码可读性更强,更有连贯性,那最好是使用block了。block经常可以用于completion handler、error handler等。

  注意:retain count 的问题

六、Target-Action

  1、Target-Action主要被用于响应用户界面事件时所需要传递的消息中。

  2、消息的接收者不知道发送者,甚至消息的发送者不需要预先知道消息的接收者。

ios 消息传递机制的更多相关文章

  1. iOS消息传递机制

    每个应用或多或少都由一些需要相互传递消息的对象结合起来以完成任务.在这篇文章里,我们将介绍所有可用的消息传递机制,并通过例子来介绍怎样在苹果的框架里使用.我们还会选择一些最佳范例来介绍什么时候该用什么 ...

  2. iOS开发——OC篇&消息传递机制(KVO/NOtification/Block/代理/Target-Action)

     iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action)   今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...

  3. IOS 消息机制(NSNotificationCenter)

    消息机制 NSNotificationCenter 一直都在频繁使用,但是却对其原理不是十分了解.今天就花些时间,把消息机制原理重头到尾好好过一遍. iOS 提供了一种 "同步的" ...

  4. Storm内部的消息传递机制

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 一个Storm拓扑,就是一个复杂的多阶段的流式计算.Storm中的组件 ...

  5. 我理解的Hanlder--android消息传递机制

    每一个学习Android的同学都会觉得Handler是一个神奇的东西,我也一样,开始我以为我懂了Handler的机制,后来发现自己是一知半解,昨天想想,我能否自己实现一个Handler,让子线程与Ac ...

  6. Handler消息传递机制

    引言: 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题. 为了解决这个问题,Android制定了一条简单的规则:只允许UI线程 ...

  7. Android学习之Handler消息传递机制

    Android只允许UI线程修改Activity里的UI组件.当Android程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户 ...

  8. Chrome 消息传递机制

    Chrome插件开发入门(二)——消息传递机制 Blog | Qiushi Chen 2014-03-31 9538 阅读 Chrome 插件 由于插件的js运行环境有区别,所以消息传递机制是一个重要 ...

  9. Chrome插件开发入门(二)——消息传递机制

    Chrome插件开发入门(二)——消息传递机制   由于插件的js运行环境有区别,所以消息传递机制是一个重要内容.阅读了很多博文,大家已经说得很清楚了,直接转一篇@姬小光 的博文,总结的挺好.后面附一 ...

随机推荐

  1. JVM的粗略简述

    什么是Java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与 ...

  2. sqlserver2008使用设置sa用户登录步骤

    1.打开sql server 2008,使用windows身份验证. 2.成功登录后,点击安全性->登录名,“sa”右键选择属性,设置密码,勾选“强制密码实施策略”. 3.然后选择属性页下的“状 ...

  3. wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

  4. http://jingyan.baidu.com/article/db55b609aac41e4ba30a2f86.html

    http://jingyan.baidu.com/article/db55b609aac41e4ba30a2f86.html

  5. Codeforces Round #294 (Div. 2)

    水 A. A and B and Chess /* 水题 */ #include <cstdio> #include <algorithm> #include <iost ...

  6. 【转载】Linux下makefile详解--跟我一起写 Makefile

    概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...

  7. CCSpriteBatchNode的优化性能

    当将大量精灵加载到CCLayer时,如果直接利用[self addChild:sprite]去加载,每加载一个精灵,都必须open,draw,close, 而利用 CCSpriteBatchNode去 ...

  8. zabbix自定义键值原理

    子配置文件的配置 为了便于维护和分类管理,UserParameter的内容可以单独写一个配置文件 # vim /usr/local/zabbix/etc/zabbix_agentd.conf Incl ...

  9. 清除行内元素之间HTML空白的几种解决方案

    行内块(inline-block)是非常有用的,特别是想要不用'block'和'float'来控制这些行内元素的margin,padding之时. 问题来了,HTML源码中行内元素之间的空白有时候显示 ...

  10. win7(32/64)+apache2.4+php5.5+mysql5.6 环境搭建配置

        引用自:http://blog.csdn.net/z_cf1985/article/details/22454749 环境:win7 32.(64位的同理,下载相关软件必须是对应的64位版本) ...