Cocoa-Touch:performSelectorOnMainThread:奇怪的行为+崩溃

2024-01-01

我遇到了一种情况,我懒惰地加载来自 www 的图像。
它是一个项目列表,当点击一个项目时,详细信息视图将被推送到导航控制器。

在该详细视图中,该项目有一个图像,首先是默认图像,我想开始从 URL 加载它的图像。

所以我要做的就是创建一个对象,该对象一旦初始化就会分离一个新线程,该线程依次加载内容,然后通知我的视图数据已加载:

// in MyLoader:
- (MyLoader *)initWithUrl:(NSURL *)url requester:(id)requester {
    self.url = url;
    self.requester = requester; // both are nonatomic, retain properties
    [self performSelectorInBackground:@selector(loadIt) withObject:nil];
}

- (void)loadIt {
    NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init];
    NSData *data = [NSData dataWithContentsOfURL:url];
    [requester performSelectorOnMainThread:@selector(dataReady) withObject:data waitUntilDone:YES;
    [arp release];
}

// in MyRequester:
- (void)somewhere {
    MyLoader *loader = [[[MyLoader] alloc] initWithUrl:someUrl requester:self] autorelease];
    // then I retain loader somewhere, it's more complicated but I have verified that it's properly retained.
}

一些注意事项:

  1. 首先我认为某些变量可能有问题。我之前打了一个断点performSelectorOnMainThread并证实data and requester都还好。

  2. 然后我认为这是由于跨线程传递NSData引起的,所以我改变了withObject:nil。它仍然崩溃。

  3. 当我进一步调查时,坠机事件非常奇怪。我指定waitUntilDone:YES,我在其中放置了一个断点requester's dataReady。但是performSelectorOnMainThread调用返回(到达其后的断点),但未到达内部断点dataReady. BTW, - (void)dataReady:(NSData*)的主体目前只包含int x = 1;(放置断点)。另外,我尝试过设置waitUntilDone:NO,它仍然崩溃。

  4. 选择器未执行(未到达断点),但调用后不久发生崩溃。

有谁知道出了什么问题吗?

这是显而易见的,但为了清楚起见,如果我只是注释掉[requester performSelectorOnMainThread...部分,它不会崩溃。

另外,这里有一个堆栈跟踪,但它根本没有帮助。

#0  0x00a71004 in ___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___ ()
#1  0x93436e3b in objc_exception_throw ()
#2  0x0028aca6 in __NSThreadPerformPerform ()
#3  0x00a098e1 in CFRunLoopRunSpecific ()
#4  0x00a08c48 in CFRunLoopRunInMode ()
#5  0x0005a78d in GSEventRunModal ()
#6  0x0005a852 in GSEventRun ()
#7  0x0168a003 in UIApplicationMain ()
#8  0x000028d4 in main (argc=1, argv=0xbffff100) at /Users/myName/Document/appName/main.m:14

你有:

[requester performSelectorOnMainThread:@selector(dataReady) withObject:data waitUntilDone:YES;

应该:

[requester performSelectorOnMainThread:@selector(dataReady:) withObject:data waitUntilDone:YES;

notice: @selector(dataReady:)(带冒号)由于您将参数传递给该方法,因此假定数据就绪的定义如下:

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

Cocoa-Touch:performSelectorOnMainThread:奇怪的行为+崩溃 的相关文章

  • 如何在 ios 7 上更改重新排序控制图像

    我正在寻找一种更改重新排序控件图像和大小的方法 我使用此代码来更改重新排序图像 void tableView UITableView tableView willDisplayCell UITableViewCell cell forRow
  • ViewWillAppear 没有被 UISplitViewController 调用

    背景和目标 我有一个基于 UISplitViewController 的 iPad 应用程序 到目前为止它支持 4 个方向 但现在我想将其锁定为仅横向 我变了shouldAutorotateToInterfaceOrientation左视图
  • 防止UIScrollView的UIPanGestureRecognizer遮挡UIScreenEdgePanGestureRecognizer

    我有一个UIScrollView它填满了我应用程序的一页上的屏幕 但我希望允许用户从屏幕边缘平移以显示其后面的视图 问题是 UIScrollView 窃取了我的触摸UIScreenEdgePanGestureRecognizer在屏幕边缘
  • 为什么使用[ClassName alloc]而不是[[self class] alloc]?

    我正在读马克 达尔林普尔 Mark Dalrymple 的著作在 Mac 上学习 Objective C 仅在协议章节 所以仍然相对较新 并试图弄清楚一些事情 为什么要通过类自己的名称来引用它 如果我有一个叫做Foo 为什么我会想写 比如说
  • 如何适配iPhone 4屏幕分辨率?

    根据Apple http www apple com iphone specs html iPhone 4 拥有新的 更好的屏幕分辨率 3 5 英寸 对角线 宽屏多点触控显示屏960 x 640 像素分辨率 326 ppi 这个小细节对我们
  • UIWebView 中的 PDF

    我正在创建一个杂志应用程序 我在 UIWebView 中显示杂志的每一页 不过 Web 视图不会用 PDF 填满屏幕 它周围有一个边界 我怎样才能全屏显示它 我还没有使用 UIWebView 尝试过此操作 但您也许可以执行类似的操作来以编程
  • iPhone 崩溃日志?

    我已经配置了一部 iPhone 并让用户安装了该应用程序 它失败 是否有崩溃日志可以让我看到 iPhone 上失败的原因 Ian 如果您可以使用 xcode 将 iPhone 连接到计算机 则在管理器窗口中它会显示每个应用程序崩溃的崩溃日志
  • GMSMapView 中的倒多边形

    我必须在我的 iPhone 项目中使用 Google 地图 并且我正在使用 GMSPolygon 来绘制多边形 但是如何填充地图上除多边形内部之外的所有位置 就像下图一样 谢谢 我玩过你的问题 主要思想是用多边形填充整个地球 然后为您的特定
  • 是什么导致了这个 iPhone 崩溃日志?

    我有点卡住了 需要解决这个问题 因为我的一个应用程序出现了随机崩溃 而这些崩溃并不总是能够重现 这是崩溃日志之一 Incident Identifier 59865612 9F00 44EA 9474 2BF607AD662E CrashR
  • 如何确定iPhone铃声的当前级别?

    我正在使用 AVSystemController 将 iPhone 铃声静音 但我不知道如何确定铃声的当前级别 有任何想法吗 PS 是的 我知道使用 AVSystemController 可能会导致应用程序被 App Store 禁止 这不
  • 使用超类初始化器初始化类

    我有两个类 一个是另一个的子类 比如说Animal and Dog 超类有一些初始化器 比如initAnimal 子类有一些初始化器 比如initDog 问题是 从编译器的角度来看 做类似的事情是完全合法的Dog adog Dog allo
  • Objective Flickr 照片上传错误

    我正在使用 ObjectiveFlickr 库将照片从我的 iPhone 应用程序上传到 Flickr 我可以授权该应用程序并执行一般请求 但在尝试上传照片时遇到错误 要上传的照片是使用 AVFoundation 捕获的图像 这是相关代码
  • 确定 NSView 是否绘制的正确方法

    有没有正确的方法来确定是否NSView实际上是否在当前视图层次结构中绘制 考虑以下情况 视图完全在屏幕外 不是强制性的 该视图不在视图层次结构的顶部 The isHidden and isHiddenOrHasHiddenAncestor不
  • 使用 Cocoa 获取无法安装的驱动器列表

    我想获取在 OS X 下使用 Cocoa Objective C 无法安装 弹出的驱动器列表 我希望 NSWorkspace getFileSystemInfoForPath 能帮助我 NSArray listOfMedia NSWorks
  • PresentModalViewController 不执行任何操作

    我有一个 UIViewController parent 调用presentModalViewController与另一个 UIViewController child on viewDidLoad If parent没有 UINaviga
  • 使用 Google place API 从 lat long 获取附近的地点

    我正在使用 google place API 即 https maps googleapis com maps api place search json location 33 7167 73 0667 radius 500 type f
  • Objective C 如何将文本字段添加到导航栏中

    我正在尝试将文本字段添加到导航栏中 但它没有显示在模拟器中 我在 viewdidload 中按如下方式执行 UITextView textField UITextView alloc initWithFrame CGRectMake 0 0
  • 混合静态和动态 UITableViewController 内容会导致 NSRangeException

    我一直在寻找这个错误 并找到了一些具有类似行为的帖子 但没有解决问题的解决方案 我有一个 UITableViewController 在 SB 中声明为静态 它具有以下部分 第 0 部分 配方 是静态的 有 4 个单元格 第 1 部分 口味
  • 按下表格视图单元格时更改视图?

    我需要帮助 当我的 tableView 的单元格被选择时 我希望该单元格转到它自己的页面 我不希望每个单元格都转到同一页面 我尝试使用 FirstFolderViewController first FirstFolderViewContr
  • 如何通过辅助功能 API 获取当前所选文本的全局屏幕坐标。

    我需要帮助来了解字典应用程序如何在任何应用程序上按 CMD CTRL D 时显示所选文本的以下弹出对话框 我想实施 我的可可应用程序具有相同的功能 我的应用程序将在后台运行 并显示有关所选文本的一些热键的建议 我已经实现了热键捕获 我只需要

随机推荐

  • 从数组中删除行

    我试图遍历一个数组以查找该数组的单列中的重复条目并删除整行 我正在弄清楚rangeStart rangeEnd and lastrow上面这个部分工作正常 data Range rangeStart rangeEnd For i lastr
  • SSIS 包在一台服务器上的运行时间延长了 500 倍

    我有一个 SSIS 包 两个数据流任务 每个任务 8 个组件 从两个平面文件中读取数据 没什么了不起的 如果我在 BIDS 中运行它 大约需要 60 秒 我有一个沙箱数据库服务器 其中的包在一个作业中运行 该作业也可靠地需要 30 60 秒
  • 如何让 OS X 读取 .bash_profile 而不是 .profile 文件

    我读过很多关于不要将自定义又名命令放在 profile 文件中的建议 相反 为自己创建一个 bash profile 并添加您的别名等 但是 当我打开新终端时 如果只有 bash profile OS X 不会导出 采购其中提到的命令 我必
  • 获取 Spring MessageContext

    如何获得春天MessageContext来自 Java 类 我应该使用一些 Resource or Autowire注射contextvar 到类 或者 例如 使用一些全局上下文 SpringContext 或其他一些以获得MessageC
  • 具有多个存储库的 Git instaweb 无法正常工作

    我有以下通过 grok 镜像填充的结构 var opt git git data repositories organization1 teamA repo1 repo2 teamB repo3 repo4 organizationN te
  • function foo(){} 和 foo = function(){} 有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 JavaScript var functionName function 与 function functionName https stackoverflow com questions 33685
  • init(colorLiteralRed:,green:,blue:,alpha:) 在 Swift 4 中已弃用

    let startingColorOfGradient UIColor colorLiteralRed 255 255 green 255 255 blue 255 255 alpha 1 0 cgColor let endingColor
  • Angular:$http 和 $resource 会忽略自定义标头。为什么?

    我正在尝试访问我无法控制的 REST 服务 第一个问题是该服务不包含 Access Control Allow Origin 标头 如果我理解正确的话 这个问题会立即限制我使用 JSONP 此外 默认情况下 此服务发送 XML 而不是 JS
  • PHP - 检测远程主机断开连接

    根据文档 https www php net manual en function socket read php socket read 应该返回FALSE当远程主机关闭连接时 以及一个空字符串 当没有更多数据可供读取时 然而 在我的测试
  • 如何查找以前的合并提交

    如何找到两个分支之间的前一个合并提交 我想查看自上次将发布分支合并到主分支以来主分支中的更改 要查看发布分支自上一个分支以来的更改 很简单git diff release 但显然git diff release 不起作用 因为它还包含上次合
  • 在 svelte 文件中导出打字稿类型

    我想导出在一个文件中定义的类型并将其导入到另一个文件中 export type myNewType name string 当我添加时 linter 显示以下错误export Modifiers cannot appear here 我可以
  • 在 Python 中使用列表理解和条件语句时出现错误:“没有足够的值来解压”

    目标是创建一个输出两个值的列表理解 for 循环如下所示 paper href scopus paper title for litag in all td find all a class ddmDocTitle paper href s
  • 在 C# 中检查互联网连接是否可用

    我正在使用下面的方法来检查 c 中的互联网连接是否可用 我正在使用它使用 NET 检查 Internet 连接的最佳方法是什么 https stackoverflow com questions 2031824 what is the be
  • 使用@ManyToMany注释从连接表中级联删除

    您好 我在映射实体时遇到问题 我正在使用 JPA2 和 Hibernate 实现 我得到带有 ManyToMany 注释的表 http img204 imageshack us img204 7558 przykladd png http
  • 加载地图和标记后,更改选择框上的谷歌地图位置更改

    如何更改 Google 地图位置 以便在选择框更改时另一个纬度和经度坐标位于 Google 地图的中心 地图和标记已成功加载 唯一需要更改的是 当从选择框中选择已加载的地图时 将其滚动到正确的城市 标记的坐标不应更改
  • 递归函数计数并打印1到n-1的分区

    我正在尝试编写一个递归函数 它必须是递归的 来打印 1 到 n 1 的分区和分区数量 例如 4 个组合的总和为 4 1 1 1 1 1 1 2 1 3 2 2 我只是在使用该功能时遇到了很多麻烦 下面这个功能不起作用 有人能帮助我吗 int
  • 同步领域 - 飞行模式

    在文档中找不到有关回退到同步领域的本地缓存版本的任何内容 例如 该应用程序以飞行模式启动 我错过了什么吗 如果用户之前登录过 当连接可用时 您可以使用SyncUser all 获取有效的经过身份验证的用户 但如果不存在用户 则需要对身份验证
  • 将常量永久注入 Tensorflow 图中进行推理

    我训练一个带有占位符的模型is training is training ph tf placeholder tf bool 然而 一旦训练和验证完成 我想永久注入一个常数false为这个值 然后 重新优化 图表 即使用optimize f
  • 使用 Electron 在本地保存文件

    我有一些模板文件 每个模板文件包含一些变量字符串 我想用 Electron 构建一个非常简单的输入表单 https www electronjs org https www electronjs org 并且我想将组成的输出文件保存在用户的
  • Cocoa-Touch:performSelectorOnMainThread:奇怪的行为+崩溃

    我遇到了一种情况 我懒惰地加载来自 www 的图像 它是一个项目列表 当点击一个项目时 详细信息视图将被推送到导航控制器 在该详细视图中 该项目有一个图像 首先是默认图像 我想开始从 URL 加载它的图像 所以我要做的就是创建一个对象 该对