Dealloc 被调用两次?

2024-03-29

解决!

感谢孤独枪手,这个问题是由于在释放许多代表之前没有将其设置为零而造成的。

这是一个奇怪的......我熟悉基本的内存管理,但我认为我所看到的有些不寻常。这是一些背景...

我有一个 NavigationController 来处理以下 ViewController 之间的导航:

首页 -> 游戏 -> 游戏

当运行代码时,它会在离开游戏时掉落。 GameViewController 中有一个 dealloc 方法,类似于:

- (void)dealloc 
{
    [board release];
    [opponentsViewController release];
    [instructionsViewController release];
    [imgPicker release];
    [gameView release];
    [super dealloc];
}

当导航控制器返回游戏列表(从游戏)时,它会抛出 EXC_BAD_ACCESS。所以我打开我值得信赖的分析器并检查僵尸。唉,正如我预期的那样,一条消息被发送到一个已释放的对象!深入挖掘后,我发现该对象的历史记录中有 3 个条目:

  1. 棋盘被分配(由游戏的 init 方法调用)
  2. 棋盘被释放(由游戏的 dealloc 方法调用)
  3. 棋盘被僵尸化(由游戏的 dealloc 方法调用)

调用 2 和 3 都是从 UINavigationController setDisappearingViewController 调用的。

在我的 dealloc 方法中,我为每个释放调用设置断点,这样做时 - 发生 [board release] 调用,然后发生 [opponentsViewController release] 调用,然后再次发生 [board release] 调用。所以我看到 dealloc 方法没有完全完成并再次调用。

可能是什么原因造成的?

编辑:这是GameViewController 实现 https://gist.github.com/84f1e1026d4201fa6bc1

来自添加此游戏的游戏控制器的代码:

-(void) gotoGame:(int)tag {

    game = [[GameViewController alloc] init];
    [self.navigationController pushViewController:game animated:YES];
    [game release];

}

编辑:这是游戏视图控制器头 https://gist.github.com/32a13d2b1a95fe0f7ee5


我会尝试将所有 ivar 的代表设置为 nil (编辑:在 dealloc 中)。我在获取结果控制器时遇到了类似的问题。无法在 dealloc 中将其委托设置为 nil,并且当视图控制器被释放时,核心数据堆栈仍然有一个指向它的指针。

所以这就是我的赌注,在 dealloc 中将 ivar delegates 设置为 nil,尽管我看不到你的标头来确定你所遵循的协议。

编辑:解释

设置委托实际上是给正在执行委托的对象一个指针(我相信它通常是一个分配的属性)。

@property (assign) delegate;

我将使用我遇到的问题作为例子。

假设您有一个视图控制器,其中有一个 fetchedResultsController 作为 ivar。当您设置 FRC 委托时:

fetchedResultsController.delegate = self;

并且视图控制器被释放,任何使用该指针的对象仍然认为它是活动的。您可能会认为既然 FRC 也在 dealloc 中发布,您就可以了(这就是为什么我花了 4 天才弄清楚这一点:)),但有时实现的其他部分也使用您的委托。所以修复方法是:

-(void)dealloc
{
    self.fetchedResultsController.delegate = nil;
    [_fetchedResultsController release];
    [super dealloc];
}

注意:一旦每个人都可以使用新工具,您就不必再担心这些事情了 ^ ^;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dealloc 被调用两次? 的相关文章

  • UITableView 显示的行数多于 numberOfRowsInSection 中指定的行数:

    我希望我的 tableView 显示 6 行 其中包含文本 在本例中为 示例 据我所知 我有我的numberOfSectionsInTableView and numberOfRowsInSection 设置正确 请参阅下面的示例代码 NS
  • Windows 下 iOS 开发的替代方案 [重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 Windows 开发机为 iPhone 进行开发 https stackoverflow com questions 22358 how can i develop for iphone u
  • 保存时出现 iphone 核心数据未解决的错误

    尝试保存时 我从核心数据中收到一条奇怪的错误消息 但问题是错误不可重现 在执行不同任务时 它会在不同时间出现 错误消息 Unresolved error Domain NSCocoaErrorDomain Code 1560 UserInf
  • 如何在 iOS 中按下后退按钮时创建确认弹出窗口?

    我想在有人按下 iOS 应用程序的 后退 按钮时添加一个弹出窗口 询问用户是否真的想回来 然后 根据用户的响应 我想撤消该操作或继续 我尝试在视图的 viewWillDisappear 函数中添加代码 然后编写正确的委托 但它不起作用 因为
  • 使用 GCD 异步 UITableViewCell 图像加载

    我目前正在尝试加载 Flickr 照片的 UITableView 列表 cs193p iOS 斯坦福大学 作业 5 为了避免 UI 阻塞事件 我将每个单元格的缩略图下载推迟到不同的队列中 但确实将 UI 更新回主队列中 此代码不会异步加载图
  • 如何在 Flutter 中为 Button 添加渐变?

    有没有办法改变ElevatedButton背景颜色渐变 如果没有一些小瑕疵或问题 例如缺少涟漪效应 不需要的边框 不尊重主题的内容 上述所有解决方案都无法真正发挥作用minWidth对于按钮 The 下面的解决方案没有上述问题 关键部分是使
  • 如何“旋转”图层/视图(例如,就像在 enigmo 中一样)

    我知道如何根据触摸移动图层 但我也希望能够旋转图像 是否有任何示例代码显示如何执行此操作 或者有人可以给我一些建议吗 Thanks 最简单的方法是使用图层的变换属性 float angle M PI rotate 180 or 1 radi
  • iOS 中的 FacebookSDK 不显示关闭按钮且无法关闭

    您好 我已经为 iOS 6 应用程序集成了 Facebook SDK Facebook 身份验证和共享工作完美 但没有提供关闭 FB 对话框的规定 当FB对话框打开时 只有在身份验证成功后才会关闭 没有关闭或导航回来的规定 我如何制作关闭按
  • iOS UITableViewCellAccessoryCheckmark 在每次滚动时可见

    我有一个列表 我将其用作复选框 我已启用或禁用选择行上的复选标记 但是当我滚动列表时 它会在每 10 行之后标记行 void tableView UITableView tableView didSelectRowAtIndexPath N
  • 我无法让 HealthKit 工作。缺失的权利

    我很难让 HealthKit 为我的 iOS 应用程序工作 我已经完成了所有步骤到目前为止我已经找到了 http jademind com blog posts healthkit api tutorial 似乎没有一个能解决我的问题 当我
  • 如何在 iPhone 应用程序中播放来自服务器的视频 URL

    实际上 我通过使用从服务器获取一个网址XMLParser 我想在我的应用程序中播放这个视频网址 现在我使用了 MPMoviePlayerController 但它不起作用 请帮忙 XML解析器 m id loadXMLByURL NSStr
  • 更改 UINavigationBar 中 UIBarButtonItem 的位置

    如何更改 UIBarButtonItem 在 UINavigationBar 中的位置 我希望我的按钮比正常位置高约 5 像素 此代码为 UINavigationBar 创建一个具有图像背景和自定义位置的后退按钮 诀窍是创建一个中间视图并修
  • 如何确定 NSURLSessionTask 请求何时开始?

    I use NSURLSessionTask我正在尝试监视我的一些 HTTP 请求需要多长时间 我可以监视什么委托方法 或其他方法 NSURLSessionTask实际上提出了最初的请求 如果这是一个NSURLConnection里面一个N
  • iOS:在代码中访问 app-info.plist 变量

    我正在开发通用应用程序 并且希望访问代码中 app info plist 文件中存储的值 原因 我使用以下方法从故事板动态实例化 UIViewController UIStoryboard storyboard UIStoryboard s
  • UIKIT_EXTERN_CLASS 和 UIKIT_EXTERN,这两个常量是什么?

    当我在文档中定义类时 我总是在 interface 之前看到这两件事 UIKIT EXTERN CLASS 和 UIKIT EXTERN 这些常量代表什么以及为什么 Apple 将其放在类之前 另一件事是 有文件 UIKitDefines
  • 通过 CTFontRef 或 CGFontRef 对象中的字形索引获取 unicode 字符

    CTFontRef 提供了出色的方法 例如CTFontGetGlyphsForCharacters用于将字符映射到字形 我的问题是 有没有逆映射的方法 也就是说 我可以通过给定的字形获取字符吗 自从我发现有一个CTFontCopyChara
  • stringFromDate 始终为 NIL

    我知道这是一个重复的问题 但是在 stackoverflow 和 google 上搜索了许多类似的问题后 没有一个解决方案对我有用 我正在尝试将从数据库收到的日期转换为字符串格式以在 iPhone 应用程序中显示 我正在按以下方式将日期转换
  • 是否可以开发一个可以跟踪其他应用程序使用情况的应用程序?

    我很想知道是否有可能为 iOS 开发一款类似的应用程序 就像本周刚刚发布的 Android 版应用程序一样 https play google com store apps details id com appuccino Frequenc
  • 制作一个固定大小的 UIView,如 UISwitch(使用 IBDesignable)

    当我使用时本指南 http iphonedev tv blog 2014 12 15 create an ibdesignable uiview subclass with code from an xib file in xcode 6要
  • 如何检测文本是否可读?

    我想知道是否有一种方法可以告诉给定的文本是人类可读的 我所说的人类可读的意思是 它有一些含义 格式就像某人写的文章 或者至少是由软件翻译器生成的供人类阅读的文章 这是背景故事 最近我正在制作一个应用程序 允许用户将短文本上传到数据库 在部署

随机推荐