关于iOS中的kvo错误 _NSSetObjectValueAndNotify

Foundation`_NSSetObjectValueAndNotify:

...

0x116156dfb <+27>:  callq  0x116340498               ; symbol stub for: object_getClass

0x116156e00 <+32>:  movq   %rax, %rdi

0x116156e03 <+35>:  callq  0x1163404a4               ; symbol stub for: object_getIndexedIvars

...

0x116156e12 <+50>:  callq  0x116340636               ; symbol stub for: pthread_mutex_lock

...

0x116156e1e <+62>:  callq  0x11633f20e               ; symbol stub for: CFDictionaryGetValue

0x116156e23 <+67>:  movq   0x31c35e(%rip), %rsi      ; "copyWithZone:"

...

0x116156e2f <+79>:  callq  *0x27496b(%rip)           ; (void *)0x00000001180cfac0: objc_msgSend

0x116156e35 <+85>:  movq   %rax, %r12

0x116156e38 <+88>:  movq   %r14, %rdi

0x116156e3b <+91>:  callq  0x116340642               ; symbol stub for: pthread_mutex_unlock

0x116156e40 <+96>:  cmpb   $0x0, 0x60(%rbx)

0x116156e44 <+100>: je     0x116156e86               ; <+166>

0x116156e46 <+102>: movq   0x31d47b(%rip), %rsi      ; "willChangeValueForKey:"

0x116156e4d <+109>: movq   0x27494c(%rip), %r14      ; (void *)0x00000001180cfac0: objc_msgSend

...

0x116156e63 <+131>: callq  0x11633fee0               ; symbol stub for: class_getMethodImplementation

...

0x116156e74 <+148>: movq   0x31d465(%rip), %rsi      ; "didChangeValueForKey:"

0x116156e7b <+155>: movq   %r13, %rdi

0x116156e7e <+158>: movq   %r12, %rdx

0x116156e81 <+161>: callq  *%r14

0x116156e84 <+164>: jmp    0x116156ee6               ; <+262>

0x116156e86 <+166>: movq   0x274443(%rip), %rax      ; (void *)0x0000000119f9c070: _NSConcreteStackBlock

0x116156e8d <+173>: leaq   -0x70(%rbp), %r9

0x116156e91 <+177>: movq   %rax, (%r9)

0x116156e94 <+180>: movl   $0xc2000000, 0x8(%r9)     ; imm = 0xC2000000

0x116156e9c <+188>: movl   $0x0, 0xc(%r9)

0x116156ea4 <+196>: leaq   0x191(%rip), %rax         ; ___NSSetObjectValueAndNotify_block_invoke

0x116156eab <+203>: movq   %rax, 0x10(%r9)

0x116156eaf <+207>: leaq   0x278b6a(%rip), %rax      ; __block_descriptor_tmp.44

...

0x116156ece <+238>: movq   0x31df0b(%rip), %rsi      ; "_changeValueForKey:key:key:usingBlock:"

0x116156ed5 <+245>: xorl   %ecx, %ecx

0x116156ed7 <+247>: xorl   %r8d, %r8d

0x116156eda <+250>: movq   %r13, %rdi

0x116156edd <+253>: movq   %r12, %rdx

0x116156ee0 <+256>: callq  *0x2748ba(%rip)           ; (void *)0x00000001180cfac0: objc_msgSend

0x116156ee6 <+262>: movq   0x31c053(%rip), %rsi      ; "release". // crash 位置

0x116156eed <+269>: movq   %r12, %rdi

0x116156ef0 <+272>: callq  *0x2748aa(%rip)           ; (void *)0x00000001180cfac0: objc_msgSend

....

出现这个问题的原因在于 注册了两次kvo 但是仅仅是释放了一次,这是其中的一个问题,但是kvo 不是万能的因为在

nm -a /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation

00000000000e63fa t __NSSetBoolValueAndNotify

000000000006d515 t __NSSetCharValueAndNotify

000000000006d3bb t __NSSetDoubleValueAndNotify

00000000000e768b t __NSSetFloatValueAndNotify

00000000000e756b t __NSSetIntValueAndNotify

0000000000075e6b t __NSSetLongLongValueAndNotify

000000000017c4af t __NSSetLongValueAndNotify

000000000006f3c6 t __NSSetObjectValueAndNotify

00000000000e18ef t __NSSetPointValueAndNotify

000000000017c93f t __NSSetRangeValueAndNotify

00000000000d631c t __NSSetRectValueAndNotify

000000000017c6f7 t __NSSetShortValueAndNotify

00000000000de41f t __NSSetSizeValueAndNotify

000000000017c38c t __NSSetUnsignedCharValueAndNotify

00000000000f6f53 t __NSSetUnsignedIntValueAndNotify

00000000000d40d7 t __NSSetUnsignedLongLongValueAndNotify

000000000017c5d3 t __NSSetUnsignedLongValueAndNotify

000000000017c81b t __NSSetUnsignedShortValueAndNotify

000000000017b7e4 t __NSSetValueAndNotifyForKeyInIvar

000000000017b846 t __NSSetValueAndNotifyForUndefinedKey

Foundation 提供了大部分基础数据类型的辅助函数(Objective C中的 Boolean 只是 unsigned char 的 typedef,所以包括了,但没有 C++中的 bool),此外还包括一些常见的 Cocoa 结构体如 Point, Range, Rect, Size,这表明这些结构体也可以用于自动键值观察,但要注意除此之外的结构体就不能用于自动键值观察了。对于所有 Objective C 对象对应的是 __NSSetObjectValueAndNotify。

总结:在使用kvo 的时候注意一点,一定是注册一个删除一个,不能说注册两次而销毁一次,另外最坑的是,crash 的地方和监听的属性没有直接关系,如图,注册两次的监听 A属性,但是crash 出现在B 上面

需要深入的同学可以看如下文档

Key-value observing:官方文档

Key-Value Observing Done Right : 官方 KVO 实现的缺陷

时间: 2024-08-05 21:02:21

关于iOS中的kvo错误 _NSSetObjectValueAndNotify的相关文章

iOS 中KVC、KVO、NSNotification、delegate 总结及区别

iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的关键技术之一. Demo: @interface myPerson : NSObject { NSString*_name; int      _age; int      _height; int      _w

iOS中NSNotification、delegate、KVO三者之间的区别与联系?

iOS中NSNotification.delegate.KVO三者之间的区别与联系? delegate.notification和KVO他们的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信: 1.委托delegation: 2.通知中心Notification Center: 3.键值观察key value observing,K

【转载】iOS中delegate,notification,KVO三种模式实现通信的优缺点

原帖地址:http://blog.csdn.net/yangxt/article/details/8176636 在开发iOS中,有三种模式来实现controller之间的通信: 1.委托delegation: 2.通知中心Notification Center: 3.键值观察key value observing,KVO 因此,那为什么我们需要这些模式以及什么时候用它以及什么时候不用它. 1.delegate 基本特征: 一 个controller定义了一个协议(即一系列的方法定义).该协议描

iOS中消息的传递机制(KVO、Notification、delegation、block以及target-action)---转载

注1:本文由破船[博客]译自Communication Patterns. 本文目录如下所示: 可用的机制 做出正确的选择 Framework示例 小结 每个应用程序或多或少,都由一些松耦合的对象构成,这些对象彼此之间要想很好的完成任务,就需要进行消息传递.本文将介绍所有可用的消息传递机制,并通过示例来介绍这些机制在苹果的Framework中如何使用,同时,还介绍了一些最佳实践建议,告诉你什么时机该选择使用什么机制. 虽然这一期的主题是关于Foundation Framework的,不过本文中还

ios中键值编码kvc和键值监听kvo的特性及详解

总结: kvc键值编码  1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性)           2. 如果方法属性的关键字和需要数据中的关键字相同的话                  3. 动态设置:setValue:属性值 forKey:属性名(用于简单的路径)/setValue:属性值 forKeyPath:属性名(用于复杂的路径)kvo键值监听  永久性的监听item属性值的改变,如果改变就从新设置             1.监听方法:[addObserver:self

iOS中CollectionView由于多次点击造成错误的解决方案

iOS中CollectionCiew由于多次点击,会给程序造成错误. 这个时候,我们可以用过手势类来进行判断和过滤. 但是,有一个快捷的解决方法,那就是给用户响应增加延时操作. 具体代码如下: [collectionView setUserInteractionEnabled:NO]; [collectionView performSelector:@selector(setUserInteractionEnabled:) withObject:[NSNumber numberWithBool:

ios 中 KVO

KVO(Key value observe)键值观察,是ios中的一种核心的概念,简单的理解为当某一个对象A(或者多个对象)要想监听对象的B的一个或者多个属性发生变化时,就是用这种机制. KVO的优点 当某个对象有个属性改变,KVO会自动的消息通知对方,这样的架构有多种好处.首先开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知,这是KVO机制的最大优点,因为这个方案已经被明确定义,获得框架级的支持,可以方便的采用,开发人员不需要添加任何代码,不需要设计自己的开发者模型,直接就可以

IOS中关于KVC与KVO知识点

一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCoding/NSKeyValueObserving非正式协议的形式被定义为基础框架的一部分.从协议的角度来说,KVC/KVO本质上是定义了一套让我们去遵守和实现的方法.当然,KVC/KVO实现的根本是Objective-C的动态性和runtime,这在后文的原理部分会有详述.另外,KVC/KVO机制离不开访问器方法的实现. 1.KVC简介 全称是Key-value codin

iOS中的MVC

我们今天谈谈cocoa程序设计中的 模型-视图-控制器(MVC)范型.我们将从两大方面来讨论MVC: 什么是MVC? M.V.C之间的交流方式是什么样子的? 理解了MVC的概念,对cocoa程序开发是至关重要的. 一.MVC的概念 MVC是Model-VIew-Controller,就是模型-视图-控制器,这些都是什么东西呢? MVC把软件系统分为三个部分:Model,View,Controller.在cocoa中,你的程序中的每一个object(对象)都将明显地仅属于这三部分中的一个,而完全不