ios 消息传递机制
一、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
[@[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等。
六、Target-Action
1、Target-Action主要被用于响应用户界面事件时所需要传递的消息中。
2、消息的接收者不知道发送者,甚至消息的发送者不需要预先知道消息的接收者。
ios 消息传递机制的更多相关文章
- iOS消息传递机制
每个应用或多或少都由一些需要相互传递消息的对象结合起来以完成任务.在这篇文章里,我们将介绍所有可用的消息传递机制,并通过例子来介绍怎样在苹果的框架里使用.我们还会选择一些最佳范例来介绍什么时候该用什么 ...
- iOS开发——OC篇&消息传递机制(KVO/NOtification/Block/代理/Target-Action)
iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action) 今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...
- IOS 消息机制(NSNotificationCenter)
消息机制 NSNotificationCenter 一直都在频繁使用,但是却对其原理不是十分了解.今天就花些时间,把消息机制原理重头到尾好好过一遍. iOS 提供了一种 "同步的" ...
- Storm内部的消息传递机制
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 一个Storm拓扑,就是一个复杂的多阶段的流式计算.Storm中的组件 ...
- 我理解的Hanlder--android消息传递机制
每一个学习Android的同学都会觉得Handler是一个神奇的东西,我也一样,开始我以为我懂了Handler的机制,后来发现自己是一知半解,昨天想想,我能否自己实现一个Handler,让子线程与Ac ...
- Handler消息传递机制
引言: 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题. 为了解决这个问题,Android制定了一条简单的规则:只允许UI线程 ...
- Android学习之Handler消息传递机制
Android只允许UI线程修改Activity里的UI组件.当Android程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户 ...
- Chrome 消息传递机制
Chrome插件开发入门(二)——消息传递机制 Blog | Qiushi Chen 2014-03-31 9538 阅读 Chrome 插件 由于插件的js运行环境有区别,所以消息传递机制是一个重要 ...
- Chrome插件开发入门(二)——消息传递机制
Chrome插件开发入门(二)——消息传递机制 由于插件的js运行环境有区别,所以消息传递机制是一个重要内容.阅读了很多博文,大家已经说得很清楚了,直接转一篇@姬小光 的博文,总结的挺好.后面附一 ...
随机推荐
- 移动零售批发行业新的技术特色-智能PDA手持移动扫描打印销售开单收银仪!!
提起便利店或者超市,大家的第一印象一定是前台那个笨重的POS机和站在POS机后的收银员.传统的零售店中,笨重的POS机随处可见. 变革前,零售盘点多烦忧 一个顾客要结账,就需要通过POS机.小票打印机 ...
- PDA应用在WMS仓储管理系统 实现无线扫描出入库作业
WMS系统是根据仓储物流管理的建设实施经验而推出的一款专业化仓储管理软件.与传统进销存软件相比优势在于,其不但包含了正常的出入库.盘点等库存管理基本功能,重点在于可以实现仓库作业过程的管理,通过条码及 ...
- mysql之对表的操作
1. 表的基本概念 在数据库中,表是一种非常重要的数据库对象,是组成数据库的基本对象,由若干个字段组成,主要用来储存数据记录. 表中的数据库对象包含列,索引和触发器. 列:也称属性列,在具体创建表时必 ...
- MVC 使用HandleErrorAttribute统一处理异常
HandleErrorAttribute继承自FilterAttribute,且实现了IExceptionFilter接口. 属于AOP思想的一种实现,MVC的四大筛选器(权限,动作,结果,异常)中的 ...
- Open the Lock[HDU1195]
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 精通CSS :nth-child伪类
:nth-child 基本用法 :nth-child:nth-child(8) 选中第8个子元素 li:nth-child(8) span { background-color: #298EB2; b ...
- fork和execve
fork函数在新的子进程中运行相同的程序,新的子进程是父进程的一个复制品. execve函数在当前进程的上下文中加载并运行一个新的程序.它会覆盖当前进程的地址空间,但并没有创建一个新的进程.新的程序仍 ...
- HDU 4671 Partition(定理题)
题目链接 这题,明显考察搜索能力...在中文版的维基百科中找到了公式. #include <cstdio> #include <cstring> #include <st ...
- MySQL 用户管理——权限表
权限表 权限表存放在mysql数据库中 user表结构 用户列:Host.User.Password 权限列:*priv 资源控制列:max* 安全列:其余 db表 存储了用户对某个数据库的操作权 ...
- JavaScript 导出Excel 代码
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...