- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这里很奇怪,当从一个 block 中解雇时,并没有调用 dealloc。代码:
[[NSNotificationCenter defaultCenter] addObserverForName:@"user.login" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {
[self dismissModalViewControllerAnimated:YES];
}];
有人知道为什么会这样吗?我如何从 block 内部解雇并同时运行 dealloc?
我试过 self 执行选择器,但这没有任何区别。
谢谢
最佳答案
(1) 您的代码有误(不完整)。当您发出 addObserverForName:
时,您必须捕获返回值;这是观察者 token 。您将其存储在某处(例如实例变量):
self->observer = [[NSNotificationCenter defaultCenter]
addObserverForName:@"woohoo" object:nil queue:nil
usingBlock:^(NSNotification *note)
{
//whatever
}];
稍后,当您不复存在时,您可以通过调用 removeObserver:
并将该观察者标记作为参数从通知中心删除该观察者标记。如果不这样做,稍后可能会崩溃。
[[NSNotificationCenter defaultCenter] removeObserver:self->observer];
(2) 但是等等,还有更多!在 ARC 下,复制 block 时,您将获得一个保留周期。这是因为存储的观察者 token 包含该 block 并且本身保留了 self 。我会给你三种方法来打破这个保留周期:
(a) 将观察者 token 存储为弱引用:
__weak id observer;
(b) 将观察者 token 存储为强引用,但在移除观察者时显式释放它(通过消除它):
[[NSNotificationCenter defaultCenter] removeObserver:self->observer];
self->observer = nil; // crucial
(c) 在创建 block 时像这样进行“弱-强舞蹈”(我假装 self
是 FlipsideViewController):
__weak FlipsideViewController* wself = self;
observer = [[NSNotificationCenter defaultCenter]
addObserverForName:@"user.login"
object:nil queue:nil usingBlock:^(NSNotification *note) {
FlipsideViewController* sself = wself;
[sself dismissModalViewControllerAnimated:YES];
}];
现在,正如我的一位评论者所暗示的那样,您可能认为“弱-强之舞”是一种极端的方法。但它有一个巨大的优势:它是这三种解决方案中唯一允许您在 dealloc
中删除观察者的解决方案。对于其他两个解决方案,dealloc
将永远不会被调用,直到您调用 removeObserver:
之后 - 找到一个更好的调用它的地方可能不会放轻松。
关于objective-c - 从 block 中关闭模态视图时 Dealloc 不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7023894/
阅读目录 1、视图介绍 2、创建视图 3、查询视图 4、修改视图 5、删除视图 6、检查选项
基于函数的视图你已经get了,基于类的视图get了吗?CBV本质不知道?点进来看源码分析~ Django 视图之FBV 与 CBV FBV(function base views) 基于函数的视图,就
SQLite 视图(View) 视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLite 语句。视图(View)实际上是一个以预定义的 SQLite 查询形式存在的表的组合。 视图
视图 什么是视图?视图的作用是什么? 视图(view)是一种虚拟存在的表,是一个逻辑表,它本身是不包含数据的。作为一个select语句保存在数据字典中的。 通过视图,可以展现基表(用来创建视图
代码如下: CREATE OR REPLACE VIEW BLOG_V_ADMIN (ID,NICKNAME,SEX,EMAIL,
创建视图 视图包含应用的 HTML 代码,并将应用的控制器逻辑和表现逻辑进行分离。视图文件存放在 resources/views 目录中。下面是一个简单的视图示例:
加密测试的存储过程 ? 1
简介数据库快照 数据库快照,正如其名称所示那样,是数据库在某一时间点的视图。是SQL Server在2005之后的版本引入的特性。快照
一 ,mysql事务 MYSQL中只有INNODB类型的数据表才能支持事务处理。 启动事务有两种方法 (1) 用begin,rollback,commit来实现 复制代码代码如
前言 在日常开发中,存储数据的最常用的方式便是数据库了,其中最为著名的便是MySQL数据库,因它简便易于上手而且可扩展性强大,跨平台使得它广为使用。上一篇文章,我们讲到了它的安装,今天我们就来
1、视图 视图:VIEW,虚表,保存有实表的查询结果,实际数据不保存在磁盘 物化视图:实际数据在磁盘中有保存,加快访问,MySQL不支持物化视图 基表:视图依赖的表 视图中的数据事实上
事项开启和使用 ? 1
代码如下: create PROCEDURE sp_decrypt(@objectName varchar(50)) AS begin begin tran&
前言 在之前 《Oracle打怪升级之路一》中我们主要介绍了Oracle的基础和Oracle常用查询及函数,这篇文章作为补充,主要介绍Oracle的对象,视图、序列、同义词、索引等,以及PL/SQL编
我是一名优秀的程序员,十分优秀!