首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

带有NSNotification的removeObserver ...我做错了什么?

在使用 NSNotification 时,如果在 dealloc 方法中忘记移除观察者,可能会导致程序崩溃或者其他未定义的行为。为了避免这种情况,建议在 dealloc 方法中移除所有观察者。

以下是一个简单的示例:

代码语言:objective-c
复制
- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

如果你在其他地方添加了观察者,请确保在不再需要时移除它们。例如,如果你在 viewDidLoad 方法中添加了观察者,请在 viewDidUnload 方法中移除它们。

代码语言:objective-c
复制
- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:@"SomeNotification" object:nil];
}

- (void)viewDidUnload {
    [super viewDidUnload];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"SomeNotification" object:nil];
}

总之,在使用 NSNotification 时,请确保在不再需要时移除观察者,以避免内存泄漏和其他问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

透彻理解 NSNotificationCenter 通知

其实我们可以很轻易想到,便利发送通知方法不过是对于使用NSNotification发送通知一个语法糖,NSNotification才是消息体。...可能有人会问,为什么系统库没有做个重复添加判断?当然,这可能是为了让我们更灵活运用,也可能是对时间复杂度一种妥协吧?。...注意上面的代码中,将[self _removeObserver:observer];注释掉了,意味着该方法已经被我截取了,我们再向该“移除通知未遂”响应者observer发送通知,直接崩溃。...这么理由:在通知整个功能体系中,“添加”、“发送”、“移除”哪一步对效率要求最高?...这就是为什么不直接使用observer响应者对象对比做释放操作。 写在后面 关于实现部分,虽然做了个大致测试,可能还是会存在一些潜在问题,希望各位大佬不惜笔墨点拨一番?。

2.3K70

浅谈 iOS NSNotification

这是为什么呢?我们先了解一下,为什么 iOS 9 之前需要手动移除观察者对象。...在 MRC 时代,观察者注册时,通知中心并不会对观察者对象 retain 操作,而是对观察者对象进行 unsafe_unretained 引用。...block 上面苹果官方给我们提供方法外,我们还可以利用基于 block NSNotification 去实现,apple 从 ios4 之后提供了带有 block NSNotification...removeObserver:self name:POST_NOTIFICATION object:nil]; } 但是带 block 方式 remove 便不能像上面这样处理了。...当然,想要在子线程发送 Notification、接收到 Notification 后在主线程中后续操作,可以用一个很笨方法,在 handleNotification 里面强制切换线程: - (void

1.3K30

什么喜欢它?带有解释推荐系统第二弹

用户评论生成器是希望生成和用户相近评论,而评论判别器则希望能将生成样本和真实评论分开。本文采用卷积形式来进行此操作,具体框架如上图所示。...1.3. reinforce评论生成对抗训练 我们假设生成器是一个虚拟agent, 它目的是在每次尝试中尽可能获得多reward(由判别器置信度给出)。...也就是说生成器目的是尽可能制造能骗过判别器生成样本。 此处我们判别器训练目标为(最大化真实样本,最小化假生成样本): 其中表示从真实评论中采样样本, 表示生成器生成样本。...评论判别器目的是判断评论是不是用户是否给商品上编写。 3. 评分预测上下文-aware矩阵分解 w我们有一个用户商品评分矩阵, 和分别是用户和商品个数。...我们假设所有的评分带有噪音(均值为0,方差为高斯噪音), 所以我们评分为: 如果用户对商品进行评分,那么为1,否则为0.

63620

【IOS开发基础系列】UIAlertController专题

下面的代码片段展示了如何初始化和显示一个带有“取消”和“好”按钮对话框视图。...或许您可以看到带有otherButtonTitlesinit方法,但是很遗憾,这个方法是没有办法通过编译。...“警示”样式         什么是“警示”样式呢?我们先不着急回答这个问题,先来看一下下面关于“警示”样式简单示例。在这个示例中,我们将前面的示例中“好”按钮替换为了“重置”按钮。     ...[[NSNotificationCenter defaultCenter] removeObserver: self name: UITextFieldTextDidChangeNotification...本文代码可以在Github主页上找到,包括了AlertController - ObjC以及AlertController - swift。

43530

什么分享时候会感觉大脑空白

这也是最近遇到问题,这两个月做了两次技术分享,第一次就遇到上面的情况,有的点因为紧张怎么都想不起来,只能尴尬说,回头再重新捋一下发给大家。 为了避免每次遇到这种问题,得想办法解决。...再从大脑结构来说,你可以理解它们分布在这个位置: 从距离上说,本能脑和情绪脑距离心脏更近,一旦出现紧急情况,它们就会优先得到供血,这就是为什么紧张时候会感觉大脑空白,因为最上方理智脑供血不足了。...而且因为它年龄小,在遇到危险时候,本身也竞争不过其他两重脑,所以就能解释,为什么人在遇到危险时候都靠本能反应而不是靠理智。 02 那怎么解决这个问题呢? 其实很简单,就是打稿子,然后自己多练。...虽然没有连麦经验,但是感觉分享形式都是相通,所以我建议她先把要分享内容打稿,并熟读几遍,这样就算连麦紧张,还有稿子可以提醒,阿常执行力真的太强了,当天晚上稿子就出来了。...昨天看了阿常和小林连麦,非常稳,这也是要继续学习方向。 好了今天分享就到这里。 今日鸡汤: 自信人生二百年,会当击水三千里。

53240

程序员面试闪充 -- KVC&KVO

在OC中使用KVO操作常用方法如下: 注册指定Key路径监听器:addObserver:forKeyPath:options:context 删除指定Key路径监听器:removeObserver...而且使用KVC后执行效率要低于合成存取器,因为使用KVC必须先解析字符串,然后再设置或服务对象实例变量。 2、NSNotification和KVO区别和用法是什么?...什么时候应该使用通知,什么时候应该使用KVO,它们实现上有什么区别吗?...答:NSNotification是通知模式在iOS实现,KVO全称是键值观察(Key-value observing),其是基于KVC(key-value coding),KVC是一个通过属性名访问属性变量机制...将Model层变化,通知到多个Controller对象时,可以使用NSNotification;如果是只需要观察某个对象某个属性,可以使用KVO。

738110

什么建议线上高并发量日志输出时候不能带有代码位置

如果大家发现网上有抄袭本文章,欢迎举报,并且积极向这个 github 仓库 提交 issue,谢谢支持~ 本文是“为什么建议”系列第二篇,本系列中会针对一些在高并发场景下,对于组内后台开发一些开发建议以及开发规范要求进行说明和分析解读...往期回顾: 为什么建议在复杂但是性能关键表上所有查询都加上 force index 在业务一开始上线时候,我们线上日志级别是 INFO,并且在日志内容中输出了代码位置,格式例如: 2022-03...G1 Garbage Collection这个事件查看: 发现 GC 全部为 Young GC,且耗时比较正常,频率上也没有什么明显异常。... 与 StackWalkBenchmark.toString 结果,我们看出 bh.consume(time); 本身没有什么性能损失。...由此,建议:对于微服务环境,尤其是响应式微服务环境,堆栈深度非常深,如果会输出大量日志的话,这个日志是不能带有代码位置,否则会造成严重性能衰减。

1.4K20

iOS APP运行时Crash自动修复系统

“小王啊,刚刚上线X.X.X版本出问题了啊,怎么样操作会crash啊,导致新功能都无法使用了,快定位一下是什么原因,抓紧hotpatch修复一下啊!”。...心里一万头草泥马呼啸而过,瞬间已经满头大汗你却还要故作镇静地回答:“嗯,老板马上去看看,一定努力解决问题!” 急忙打开电脑你,知道今夜注定无眠了。...5.如果没有重写拦截调用方法,程序报错。 3.1.3 拦截调用 在方法调用中说到了,如果没有找到方法就会转向拦截调用。 那么什么是拦截调用呢?...这时应该调用原有removeObserver方法将delegate对应观察者移除。...避免出现KVO被观察者dealloc时仍然注册着KVO而产生crash 3.3 NSNotification类型crash防护(NSNotification) 3.3.1 NSNotification

3.2K1713

随机播放歌曲算法,原来是这么一直都搞错了

本篇文章,将以数组为基础,探索“在线洗牌”原理。同时,我会以多种方式编写这个原理代码。...还等什么,继续往下看~ 方法一:Fisher-Yates 算法 Fisher-Yates 算法基本前提是遍历条目,将数组中每个元素与从数组中剩余未洗牌部分随机选择元素进行交换。...“伪随机” 意味着生成数字看起来是随机,但实际上是由确定性算法确定。它返回数字总是一个介于0到1之间浮点数。...浮点数是可以是正或负,并且可以有小数部分数字,例如 3.14、-0.5、1.0、2.71828 等等。 为什么要从 Math.random() 结果中减去 0.5 ?..., "elderberry"]; const shuffledArray = shuffle(myArray); console.log(shuffledArray); 不过,经过使用上面三种方法,还是推荐

19120

这篇神奇文章里小鼠既当实验组又当对照组!小鼠:错了什么

这是一篇LncRNA文章,题目是“STAT5A induced LINC01198 promotes proliferation of glioma cells through stabilizing...研究人员实验结果表明,与正常对照组相比,LINC01198在肿瘤组织中明显富集,LINC01198升高与不良总体预后显著相关。此外,激活转录因子STAT5A,可以诱导LINC01198表达。...所以作者认为STAT5诱导LINC01198通过稳定DGCR8在胶质瘤细胞中促进胶质瘤细胞增殖和迁移。 貌似是一篇比较中规中矩LincRNA研究套路文章。...但是,当我们看本文Fig部分时发现了很多有意思图片,第一个发现是这个小鼠肿瘤图片,找找看,这些图片有哪些问题 ? ? 有没有什么发现?...通过Photoshop比对D图和E图发现,除了c2部分数值不重合以外,其他部分也是基本完全重合! ?

52420

什么网页总是卡?前端性能优化规则要点

一说到页面的性能优化,大家可能都会想起雅虎军规、2-5-8原则、3秒钟首屏指标等规则,这些规则在开发过程中不是强制要求,但是有时候为了追求页面性能完美和体验,就不得不对原有的代码进行修改和优化。...下面整理出一些常用性能优化要点,同时再罗列一下雅虎军规、2-5-8原则、3秒钟首屏指标这三个常用规则要点。...,节省加载时间,所有静态资源都要在服务器端设置缓存,并且尽量使用长缓存(「使用时间戳更新缓存」) 缓存一切可缓存资源 使用长缓存 使用外联样式和脚本 「压缩代码」:减少资源大小可加快网页显示速度,...「首屏加载」:首屏快速显示可大大提升用户对页面速度感知,应尽量针对首屏快速显示优化 「按需加载」:将不影响首屏资源和当前屏幕不用资源放到用户需要时才加载,可大大提升显示速度和降低总体流量(「...」:过多font-size影响CSS树效率 「值为0时不需要任何单位」:为了浏览器兼容性和性能,值为0时不要带单位 「标准化各种浏览器前缀」 无前缀属性应放在最后 CSS动画属性只用-webkit

1.7K20

UI篇-关于单个页面屏幕旋转要注意问题

CGAffineTransformMakeRotation(M_PI * 2); } completion:nil]; self.frame = self.smallFrame; } } 强制带有导航条整个页面旋转...= NO; self.bottomView.hidden = YES; } } ******************更新**************** 上面的方法完美解决了一个工程单页面屏幕旋转问题...按照上面的方法确实达到了,单页面旋转,其他页面不旋转效果,但是有个问题: 在页面不旋转情况下,状态栏确会随着手机旋转而旋转,着实蛋疼。目前不清楚为什么一样设置,在两个项目中效果不一样。...之前说那些都是都是在rootViewController之后去判断,但是,在程序刚刚启动时这些判断都是无效。...看着也醉了。但是却是有作用。 ---- 小结 关于屏幕旋转问题,目前先写这些,后续如果有新东西收获,会更新上去

3.6K20

设计模式(二):自己动手使用“观察者模式”实现通知机制

一个人要想成为Observer,要在Subject中进行注册,也就是说要给Subject说,要成为你观察者,然后Subject就会给Observer推送消息。 我们不仅要知其然,还要知其所以然。...如果其他员工也想成为Observer,那么必须得进入(addObserver)正在开会会议室成为观察者。员工成功观察者后收到通知得一些事情吧(doSomething),比如记个笔记神马。...如果此时员工闹情绪,不想听老板开会了,于是通过removeObserver走出了会议室。上面这个过程其实就是观察者模式。...创建通知(NSNotification),该通知也是要发送给Observer。...这也就是为什么要为Subject命名了,在添加Observer时就是通过Subject名字来指定其观察对象。除了指定观察对象外,还需要指定收到通知后所执行方法。

1.5K60

通知 - NSNotificationCenter

1、每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间消息通信; 2、任何一个对象都可以向通知中心发布通知(NSNotification), 描述自己在做什么...(NSDictionary *)userInfo;   //一些额外信息(通知发布者传递给通知接收者信息内容) 5、初始化一个通知(NSNotification)对象构造函数:      1)...如果为nil, 那么无论通知名称是什么,监听器都能收到这个通知 --> anObject: 通知发布者。...//监听通知方法 - (void)MonitorMessage:(NSNotification *)notification; @end Person.m文件代码: #import "Person.h...- (void)dealloc { NSLog(@"移除当前监听者: %@", self.name); [[NSNotificationCenter defaultCenter] removeObserver

1.1K40
领券