EXC_BAD_ACCESS 调用块

2023-12-11

更新 |我已经使用面板​​上传了一个示例项目并在此处崩溃:http://w3style.co.uk/~d11wtq/BlocksCrash.tar.gz(我知道“选择...”按钮没有任何作用,我还没有实现它)。

更新2 |刚刚发现我什至不需要调用任何东西newFilePanel为了导致崩溃,我只需要在声明中使用它。

这也会导致崩溃:

[newFilePanel beginSheetModalForWindow:[windowController window] completionHandler:^(NSInteger result) {
    newFilePanel; // Do nothing, just use the variable in an expression
}];

似乎转储到控制台的最后一个内容有时是这样的:“无法反汇编 dyld_stub_objc_msgSend_stret。”,有时是这样的:“无法访问地址 0xa 处的内存”。

我创建了自己的工作表(NSPanel 子类),它尝试提供类似于 NSOpenPanel/NSSavePanel 的 API,因为它将自身呈现为工作表并在完成后调用块。

这是界面:

//
//  EDNewFilePanel.h
//  MojiBaker
//
//  Created by Chris Corbyn on 29/12/10.
//  Copyright 2010 Chris Corbyn. All rights reserved.
//

#import <Cocoa/Cocoa.h>

@class EDNewFilePanel;

@interface EDNewFilePanel : NSPanel <NSTextFieldDelegate> {
    BOOL allowsRelativePaths;

    NSTextField *filenameInput;

    NSButton *relativePathSwitch;

    NSTextField *localPathLabel;
    NSTextField *localPathInput;
    NSButton *chooseButton;

    NSButton *createButton;
    NSButton *cancelButton;
}

@property (nonatomic) BOOL allowsRelativePaths;

+(EDNewFilePanel *)newFilePanel;

-(void)beginSheetModalForWindow:(NSWindow *)aWindow completionHandler:(void (^)(NSInteger result))handler;
-(void)setFileName:(NSString *)fileName;
-(NSString *)fileName;
-(void)setLocalPath:(NSString *)localPath;
-(NSString *)localPath;
-(BOOL)isRelative;

@end

以及实现中的关键方法:

-(void)beginSheetModalForWindow:(NSWindow *)aWindow completionHandler:(void (^)(NSInteger result))handler {
    [NSApp beginSheet:self
       modalForWindow:aWindow
        modalDelegate:self
       didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:)
          contextInfo:(void *)[handler retain]];
}

-(void)dismissSheet:(id)sender {
    [NSApp endSheet:self returnCode:([sender tag] == 1) ? NSOKButton : NSCancelButton];
}

-(void)sheetDidEnd:(NSWindow *)aSheet returnCode:(NSInteger)result contextInfo:(void *)contextInfo {
    ((void (^)(NSUInteger result))contextInfo)(result);
    [self orderOut:self];
    [(void (^)(NSUInteger result))contextInfo release];
}

如果我的块只是一个空体的无操作,那么这一切都有效。当工作表被解除时,我的块被调用。

EDNewFilePanel *newFilePanel = [EDNewFilePanel newFilePanel];
[newFilePanel setAllowsRelativePaths:[self hasSelectedItems]];
[newFilePanel setLocalPath:@"~/"];
[newFilePanel beginSheetModalForWindow:[windowController window] completionHandler:^(NSInteger result) {
    NSLog(@"I got invoked!");
}];

但是,当我尝试从块内部访问面板时,我会因 EXC_BAD_ACCESS 崩溃。例如,这会崩溃:

EDNewFilePanel *newFilePanel = [EDNewFilePanel newFilePanel];
[newFilePanel setAllowsRelativePaths:[self hasSelectedItems]];
[newFilePanel setLocalPath:@"~/"];
[newFilePanel beginSheetModalForWindow:[windowController window] completionHandler:^(NSInteger result) {
    NSLog(@"I got invoked and the panel is %@!", newFilePanel);
}];

调试器不清楚原因是什么。堆栈上的第一项(零 0)只是显示“??”并且没有列出任何内容。

堆栈中的下一个项目(1 和 2)是对-endSheet:returnCode: and -dismissSheet:分别。查看调试器中的变量,似乎没有任何错误/超出范围。

我原以为面板可能已被释放(因为它是自动释放的),但甚至调用-retain创建后立即使用它并没有帮助。

我执行这个错误吗?


你有点奇怪retain一个方法中的参数和release当该对象不是实例变量时,它在另一个对象中。

我建议制作completionHandler你的一点beginSheet填充实例变量。无论如何,您不可能一次多次显示该工作表,而且这样会更干净。

另外,你的EXC_BAD_ACCESS最有可能来自[handler retain]打电话给你的beginSheet:方法。您可能会使用类似的方法来调用此方法(为了简洁起见):

[myObject doThingWithCompletionHandler:^{ NSLog(@"done!"); }];

如果是这样的话,你must -copy块而不是保留它。正如上面所输入的,该块位于堆栈中。但是,如果该堆栈帧从执行堆栈中弹出,则该块就会消失。poof稍后访问该块的任何尝试都将导致崩溃,因为您尝试执行不再存在且已被垃圾替换的代码。因此,您必须调用copy将其移动到堆中,在堆中它的生存期可以超过创建它的堆栈帧的生命周期。

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

EXC_BAD_ACCESS 调用块 的相关文章

  • Swift 上的 USB 连接委托

    Swift 中是否有一个代表可以让我的班级知道何时通过计算机的 USB 插入新设备 我想知道我的程序何时可以使用新设备 Eric Aya 的答案已经相当不错了 但这里有一个 Swift 3 的改编 我把大部分丑陋的东西包裹在一个USBWat
  • UICollectionView 设置列数

    我刚刚开始学习 UICollectionViews 我想知道是否有人知道如何指定集合视图中的列数 默认设置为 3 iPhone 肖像 我查看了文档 似乎找不到简洁的答案 对于 Swift 5 和 iOS 12 3 您可以使用4 以下实现为了
  • 如何从标签栏控制器上方显示 UIActionSheet 视图?

    我需要在选项卡栏控制器上方显示操作表 我的意思是 即使操作表视图处于可见模式 我也能够看到选项卡栏控制器 因此 请建议如何从选项卡栏控制器上方查看 是否可以 其次 如何更改操作表的背景颜色和取消按钮背景颜色 请帮我 谢谢你 马丹 莫汉 要从
  • Xcode - 发布和分发配置中的 Malloc_Error

    仅当我在设备上选择发布或分发配置时 我才会收到此错误 在模拟器上它运行良好 请问 我错在哪里 cc1obj 4113 malloc mmap size 429379584 failed error code 12 error can t a
  • localhost 拒绝在 chrome mac 中连接

    我正在使用 webpack dev server 使用此命令运行服务器 npm run dev 当我使用npm start 它工作得很好 但不想这样做 因为它是为了生产 到目前为止我的服务器运行良好http 本地主机 3000 http l
  • 为什么 Apple 建议以编程方式创建模态导航控制器?

    以模态方式呈现导航控制器时 以编程方式创建和配置导航控制器对象通常更简单 虽然您也可以使用 Interface Builder 来执行此操作 但通常不建议这样做 事实上 因为我的导航控制器很简单 我宁愿在IB中自定义视图 虽然我不知道确切的
  • iOS - 在相机上放置自定义叠加层(垂直对齐)。顶部黑条的大小

    我正在寻找以下问题的编程解决方案 我想在相机 iOS 上绘制自定义叠加层 我希望它位于相机输出视图的垂直中央 我已经完成了相对于屏幕而不是相机图片居中绘制自定义视图 为此 我需要获得顶部黑条的大小 我怎么才能得到它 顶部和底部栏的大小不相等
  • 为什么我无法在 Mac OS X Terminal.app 上的 Python 解释器中显示 unicode 字符?

    如果我尝试粘贴 unicode 字符 例如中间的点 在我的 python 解释器中它什么也不做 我在 Mac OS X 上使用 Terminal app 当我只是在 bash 中时 我没有遇到任何问题 但在解释器中 python Pytho
  • 将 NSFetchedResultsController 添加到项目后出现问题

    我设置 CoreData 时没有NSFetchedResultsController一切都保存得很好 切换到之后NSFetchedResultsController 我在尝试保存图像时遇到奇怪的错误 这是我用来保存图像的代码 void sa
  • FileProviderExtension 将不会在 macOS 12.2 中加载

    我是 macOS 开发新手 我正在尝试开发 macOS FileProvider 扩展 一切都很好 直到我将 macOS 从 11 更新到 12 2 更新操作系统后 NSFileProviderManager add domain 不会加载
  • dispatch_semaphore_t 重用 - 我在这里缺少什么?

    我有一些代码 其中使用dispatch semaphore t 来表示操作完成 当信号量是成员变量时 它的行为似乎不正确 我将展示有效的示例代码和似乎无效的示例代码 implementation someClass dispatch sem
  • Xcode 4.2 UITableview 自定义单元格

    我对故事板上的自定义单元格有疑问 我需要从调用的方法访问标签 UITableViewCell tableView UITableView tableView cellForRowAtIndexPath NSIndexPath indexPa
  • OSX:检测空格键向下和向上事件

    我需要记录我自己演讲的数千个简短的声音片段 我正在为语音识别引擎训练声学模型 因此 对于每个文本 屏幕上都会显示一行文本 我必须说出它 并将音频捕获到 WAV 中 我找到了一个用于录制音频的示例项目 现在我想弄清楚如何进行键盘输入 我想按下
  • 4.4 中新的 Objective-c 文字

    我可以写 42 这会创建一个NSNumber with int值 42 我可以用变量来做到这一点 例如 someIntVar 显然我尝试过但它不起作用 这很糟糕 因为然后我必须经历 NSNumber numberWithInt someIn
  • 将数据从子模态 VC 传递到父视图控制器的最佳方法?

    将数据从子模式视图传递到父视图控制器的最佳方法是什么 我的 iPad 应用程序上有一个子模式登录屏幕 我想将用户信息传回父级分割视图控制器 我正在考虑使用 NSNotification 但我不确定这是否是将数据传递回父级的最简单 最有效的方
  • iOS:GMail API - 通过电子邮件发送附件

    我能够成功发送没有附件的电子邮件 但是 当我尝试使用 GTLUploadParamaters 上传附件时 出现 501 错误 我尝试添加照片库中附件的 NSData 以及仅发送图像的 URL 在这两种情况下我都得到了同样的错误 Create
  • 将 NSDictionary 保存到文件有任何限制吗

    我想用下面的方法来保存NSDictionary void writeDicToFile NSDictionary dic fileName NSString fileName NSString filePath NSTemporaryDir
  • Xcode - 免费清除设备文件夹?

    我正在删除一些文件夹和文件 以便在驱动器上腾出更多空间 我知道在路径中 Library Developer CoreSimulator Devices 每个模拟器和每个版本都有文件夹 这个文件夹对我来说大约有 11GB 大小 我知道我可以删
  • NSLocale 货币符号,显示金额值之前或之后

    我在用StoreKit在我的应用程序中实现应用程序内购买商店 我有一个自定义设计 这意味着价格的值应该是白色的且较大的 货币符号较小 较暗并与价格值的顶部对齐 我可以使用以下命令毫无问题地获取货币符号NSLocale in SKproduc
  • 在Mac中如何在Android Studio中的项目窗口之间切换?

    我的操作系统是Mac 我在Android Studio中打开了几个项目 有时我想在项目之间切换以选择一个项目 是否有任何键盘快捷键可以像 command ctrl tab 一样执行此操作 Use Cmd Cmd 反引号 它在 Android

随机推荐

  • 如何垂直居中对齐未知高度的浮动元素?

    我有一个 水平 居中的外部 div 其中包含两个宽度未知的元素 div style width 100 margin 0 auto div div div div div 默认情况下 两个浮动都是顶部对齐的 并且具有变化 未知和不同的高度
  • 以编程方式在运行时获取摘要注释

    我正在寻找一种方法来以编程方式获取 ASP net 中方法的 Xml 注释的摘要部分 我查看了之前的相关帖子 但他们没有提供在网络环境中执行此操作的方法 我无法使用任何第三方应用程序 并且由于网络环境 Visual Studio 插件也没有
  • 当存在无效路径时如何使毕加索显示默认图像

    我在此处显示默认图像名称 R drawable avatar placeholder 时遇到一个问题 当来自Web服务的链接非空 但错误404时 意味着该链接路径上没有任何图像 如果我在下面运行此函数 则会显示字符串 路径不为空 但无法显示
  • Excel:获取单元格颜色

    1 如何使用 Excel 宏获取单元格的颜色 我无法让这个功能工作 Sub BGCol MRow As Integer MCol As Integer bgColor Cells MRow MCol Interior ColorIndex
  • C++:隐藏规则背后的基本原理

    背后的理由是什么隐藏规则 in C class A void f int class B public A void f double B f int is hidden 如果这是一个有意义的功能 我认为也应该可以隐藏函数而无需定义具有相同
  • 在循环期间在值之间优雅地插入空格而无需尾随空格

    有没有一种方法可以在循环期间在值之间优雅地插入空格 或者我想是任何字符或字符串 例如 我想执行以下操作 for int i 0 i lt 6 i System out print i 输出以下内容 0 1 2 3 4 5 但这段代码实际上在
  • 从 NSDateFormatterFullStyle 字符串中删除年份

    我搜索过这个问题 但没有找到结论性且优雅的解决方案 无论如何 是否可以更改 NSDateFormatterFullStyleyear 以抑制年份信息 我正在使用代码 NSString dateDescription NSDateFormat
  • 如何使用 C 在 MPI 中发送(MPI_Send)具有指针字段的嵌套结构

    我有一个结构 struct vertex double a double b struct polygon int numofVertex vertex v 如何使用 MPI Send 在 MPI 中发送此嵌套结构 问题是该结构包含指针字段
  • 从 Xamarin Forms 应用程序启动另一个 IOS 应用程序

    我正在尝试测试 MyApp CanOpen 中是否存在应用程序 如果是这样 我希望打开应用程序 否则我有一个 https 地址来打开 webview 我在开罐测试中得到了错误的回报 我相信我的代码是合理的 但我在 info plist 上不
  • 如何将 map.locate 与 Polymer 1.0 / leaflet-map 1.0 一起使用

    我对 Polymer 和 Leaflet 的 Web 组件都很陌生 我想要一个按钮来切换 Leaflet 给出的地理位置功能 在 Javascript HTML css 应用程序中使用 Leaflet 我知道如何做到这一点 但我无法使用 P
  • 10-08 10:23:40.433:E/MoreInfoHPW_ViewGroup(10127):父视图不是 TextView

    您好 不明白为什么我收到此错误 10 08 10 23 40 433 E MoreInfoHPW ViewGroup 10127 Parent view is not a TextView 任何帮助 将不胜感激 LayoutInflater
  • 为什么Guava的ImmutableList有这么多重载的of()方法?

    我只是在看番石榴ImmutableList我注意到of 方法被重载了12次 在我看来 他们所需要的只是 static
  • 通用静态类 - 在运行时检索对象类型

    我有一个类型的对象X 我可以 显然 在运行时检索它 var type myObject GetType 我有一个通用的静态类 public static class MyStaticClass
  • PHP 不使用 strlen() 的字符串长度

    刚刚浏览了最新版本的 PHP 编码标准 有一些东西引起了我的注意 编码标准 4 规定 在编写处理字符串的函数时 请务必记住 PHP 保存每个字符串的长度属性 并且不应该使用 strlen 计算它 我一直使用 strlen 也许只是晚了 但是
  • 如何用Python对大文件进行排序?

    我在 activestate com 上发现了一些很有前途的代码来对大文件进行排序 我试图在 Ubuntu 10 04 上的默认 Python 2 6 5 解释器上运行它 当我尝试在一个小测试文件上运行它时 我得到下面的错误跟踪 我在 ac
  • 由文本选择触发的工具提示

    我希望创建一个由选择文本 左键单击并拖动文本 触发的工具提示 最好通过创建一个 JQuery 插件 我的最终目标是当用户选择 突出显示一个句子 短语 段落时 它将触发工具提示 工具提示将包含社交共享按钮 允许用户将选择发布到他们的个人资料状
  • 甜蜜警报功能不显示消息

    我试图在将记录插入数据库后显示一条警报消息 并且正常的 js 警报工作正常 其代码是 echo echo exit 但是 当我使用 sweet Alert 函数而不是普通的 js 函数时 它不会显示
  • 后续:将 vegan 包中的 ordiellipse 函数绘制到 ggplot2 中创建的 NMDS 图上

    我正在尝试做一些类似于旧帖子的事情 绘图 原始帖子 在我的分析中 我感兴趣的是不同的哺乳动物宿主是否有不同的跳蚤群落 我链接到的原始帖子有两种不同的椭圆解决方案 我的问题是 当我运行第一个解决方案和通用解决方案时 我得到的图看起来截然不同
  • h1 和 h2 类未显示在 Internet Explorer 中

    我无法获取h1 and h2标签完全显示在 Internet Explorer 中 我查看了 CSS 文件 但仍然不明白为什么它不能在 IE9 上运行 以下是 IE 中未显示的标题的 CSS 代码 person h1 color 47526
  • EXC_BAD_ACCESS 调用块

    更新 我已经使用面板 上传了一个示例项目并在此处崩溃 http w3style co uk d11wtq BlocksCrash tar gz 我知道 选择 按钮没有任何作用 我还没有实现它 更新2 刚刚发现我什至不需要调用任何东西newF