当前位置: 首页 > news >正文

新乡网站建设设计/百度网游排行榜

新乡网站建设设计,百度网游排行榜,海外网站的建设,wordpress时间表插件欢迎大家关注我的公众号,我会定期分享一些我在项目中遇到问题的解决办法和一些iOS实用的技巧,现阶段主要是整理出一些基础的知识记录下来 文章也会同步更新到我的博客:ppsheep.com KVO和线程 KVO 行为是同步的 并且发生与所观察的值发生变化的…

欢迎大家关注我的公众号,我会定期分享一些我在项目中遇到问题的解决办法和一些iOS实用的技巧,现阶段主要是整理出一些基础的知识记录下来



文章也会同步更新到我的博客:
ppsheep.com

KVO和线程

KVO 行为是同步的 并且发生与所观察的值发生变化的同样的线程上。这听起来有点拗口,简单点说,就是监听行为发生的线程和所观察的值发生变化的线程,肯定是同一个线程,这样我们使用的时候就需要注意了:

当我们试图从其他线程改变属性值的时候我们应当十分小心,除非能确定所有的观察者都用线程安全的方法处理 KVO 通知

通常来说,我们不推荐把 KVO 和多线程混起来。如果我们要用多个队列和线程,我们不应该在它们互相之间用 KVO。

KVC

最简单的 KVC 能让我们通过以下的形式访问属性:

@property (nonatomic, copy) NSString *name;复制代码

取值:

NSString *n = [object valueForKey:@"name"]复制代码

设定:

[object setValue:@"Daniel" forKey:@"name"]复制代码

这个不仅可以访问作为对象属性,而且也能访问一些标量(例如 int 和 CGFloat)和 struct(例如 CGRect)。Foundation 框架会为我们自动封装它们。举例来说,如果有以下属性:

@property (nonatomic) CGFloat height;复制代码

我们可以这样设置:

[object setValue:@(20) forKey:@"height"]复制代码

键路径 (key path)

KVC 同样允许我们通过关系来访问对象。假设 person 对象有属性 address,address 有属性 city,我们可以这样通过 person 来访问 city:

[person valueForKeyPath:@"address.city"]复制代码

值得注意的是这里我们调用 -valueForKeyPath: 而不是 -valueForKey:

Key-Value Coding Without @property

不需要 @property 的 KVC

我们可以实现一个支持 KVC 而不用 @property 和 @synthesize 或是自动 synthesize 的属性。最直接的方式是添加 - 和 -set: 方法。例如我们想要 name ,我们这样做:

- (NSString *)name;
- (void)setName:(NSString *)name;复制代码

这完全等于 @property 的实现方式。

但是当标量和 struct 的值被传入 nil 的时候尤其需要注意。假设我们要 height 属性支持 KVC 我们写了以下的方法:

- (CGFloat)height;
- (void)setHeight:(CGFloat)height;复制代码

然后我们这样调用:

[object setValue:nil forKey:@"height"]复制代码

这会抛出一个 exception。要正确的处理 nil,我们要像这样 override -setNilValueForKey:

- (void)setNilValueForKey:(NSString *)key
{if ([key isEqualToString:@"height"]) {[self setValue:@0 forKey:key];} else[super setNilValueForKey:key];
}复制代码

集合的操作

一个常常被忽视的 KVC 特性是它对集合操作的支持。举个例子,我们可以这样来获得一个数组中最大的值:

NSArray *a = @[@4, @84, @2];
NSLog(@"max = %@", [a valueForKeyPath:@"@max.self"]);复制代码

或者说,我们有一个 Transaction 对象的数组,对象有属性 amount 的话,我们可以这样获得最大的 amount:

NSArray *a = @[transaction1, transaction2, transaction3];
NSLog(@"max = %@", [a valueForKeyPath:@"@max.amount"]);复制代码

当我们调用 [a valueForKeyPath:@"@max.amount"] 的时候,它会在数组 a 的每个元素中调用 -valueForKey:@"amount" 然后返回最大的那个。

常见的 KVO 错误

首先,KVO 兼容是 API 的一部分。如果类的所有者不保证某个属性兼容 KVO,我们就不能保证 KVO 正常工作。苹果文档里有 KVO 兼容属性的文档。例如,NSProgress 类的大多数属性都是兼容 KVO 的。

当做出改变以后,有些人试着放空的 -willChange 和 -didChange 方法来强制 KVO 的触发。KVO 通知虽然会生效,但是这样做破坏了有依赖于 NSKeyValueObservingOld 选项的观察者。详细来说,这影响了 KVO 对观察键路径 (key path) 的原生支持。KVO 在观察键路径 (key path) 时依赖于 NSKeyValueObservingOld 属性。

我们也要指出有些集合是不能被观察的。KVO 旨在观察关系 (relationship) 而不是集合。我们不能观察 NSArray,我们只能观察一个对象的属性——而这个属性有可能是 NSArray。举例说,如果我们有一个 ContactList 对象,我们可以观察它的 contacts 属性。但是我们不能向要观察对象的 -addObserver:forKeyPath:... 传入一个 NSArray。

相似地,观察 self 不是永远都生效的。而且这不是一个好的设计。

调试 KVO

你可以在 lldb 里查看一个被观察对象的所有观察信息。

(lldb) po [observedObject observationInfo]复制代码

这会打印出有关谁观察谁之类的很多信息。

这个信息的格式不是公开的,我们不能让任何东西依赖它,因为苹果随时都可以改变它。不过这是一个很强大的排错工具。

参考:

www.objccn.io/issue-7-3/

http://www.lbrq.cn/news/823771.html

相关文章:

  • 高校网站建设管理办法/简述网站内容如何优化
  • 浙江建站管理系统价格/杭州优化seo公司
  • 大气企业网站欣赏/专业恶意点击软件
  • 网站开发过程有几个阶段/职业培训机构资质
  • 一般网站服务费怎么入账做分录/百度如何精准搜索
  • magento 做的最牛逼的中文网站/站长工具seo综合
  • 校园网站建设网/seo基础知识考试
  • 网站开发职业生涯规划范文/品牌推广专员
  • 日喀则网站建设/福州整站优化
  • 如何制作购物网站/优化网站页面
  • 网站开发 开票/seo关键词优化软件app
  • 购物网站难做吗/网络优化公司
  • 新闻网站设计/东莞做网站seo
  • 黑帽seo怎么做网站排名/公司网站如何建设
  • 精美网页设计源码/苏州seo关键词优化外包
  • html5制作网站开发/站长工具seo客户端
  • 莆田有哪几家做网站设计的/鸡西seo顾问
  • vs2017网站开发组件/利于seo的建站系统有哪些
  • 好的做淘宝详情页的网站有哪些/百度网站收录提交入口
  • 建站哪个便宜/广州seo顾问服务
  • 外贸营销型网站建站/网站推广的途径有哪些
  • 网站首页设计参考/长沙seo培训
  • 阜阳做网站公司/快速seo关键词优化技巧
  • 怎么诊断网站/如何在百度提交自己的网站
  • 郑州做网站好/培训机构怎么找
  • 自建营销型网站模板/石家庄手机端seo
  • 长沙网开亿面做网站多少钱/线上网络推广怎么做
  • 17网站一起做网店打不开/员工培训
  • 会计网站建设意义/sem竞价推广公司
  • c2c网站管理系统下载/百度实时热搜榜
  • 构建一个简单的Java框架来测量并发执行任务的时间
  • 小型支付项目3-5:检测未接收到或未正确处理的支付回调通知
  • PAT 1049 Counting Ones
  • 《计算机网络》实验报告二 IP协议分析
  • 访问 gitlab 跳转 0.0.0.0
  • MySQL练习3