问题标签 [objective-c-blocks]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
16990 浏览

objective-c - 如何使用 Block 简化回调逻辑?

假设我需要与一个提供协议并在操作完成时调用委托方法的类进行通信,如下所示:

现在,我决定虽然我可以让另一个类实现stuffDone:委托方法,但我决定我宁愿将进程封装到一个块中,该块写在靠近SomeObject实例化、调用等位置的地方。我怎么能做这个?或者换句话说,如果你看这篇关于块的著名文章(在替换回调部分);我如何在 SomeObject 中编写一个接受某种completionHandler:类型的方法?

0 投票
4 回答
2671 浏览

objective-c - 是否有用于块的 SELF 指针?

我想从内部递归调用一个块。在 obj-c 对象中,我们可以使用“self”,是否有类似的东西可以从自身内部引用块实例?

0 投票
3 回答
3989 浏览

iphone - 使用递归块时的 EXC_BAD_ACCESS

我正在尝试使用块创建递归。它工作了一段时间,但最终它崩溃并给了我一个糟糕的访问异常。这是我的代码:

说明:我有一个Square有 BOOL 的课程nuked。它还有一个adjacentSquares包含其他 Squares 的 NSArray。

我想检查一个正方形或它的“连接”正方形之一是否被核弹了。

该数组processedSquares用于跟踪我检查过的正方形以防止无限递归。

当我运行它时,它会调用这个块(如预期的那样)。但是在某些时候,它会在最后一行崩溃并出现错误的访问异常。

我也在控制台中得到了这个:

无法访问地址 0x1
处的内存 无法访问地址 0x1 处的内存 无法
访问地址 0x1 处的内存 无法访问地址 0x1 处的
内存
警告:取消调用 - 当前线程堆栈上的 objc 代码使此操作不安全。

我对块和递归不太熟悉。有任何想法吗?


编辑 1

根据要求,回溯:

0 投票
1 回答
1573 浏览

cocoa - OCMock 异步阻塞回调

我正在构建一个小型库来为我处理文件上传和下载操作,并试图将一套测试集成到其中。我没有使用委托回调方法,而是在完成处理程序块中处理异步响应,如下所示:

底层uploadFileWithFilename...方法是这样的:

我看到一个例子,这个人使用预处理器定义并将 OCMock 注入到实际的代码库中。这对我来说似乎是错误的。

测试这样一段代码的最佳策略是什么?

0 投票
2 回答
1003 浏览

objective-c - NSArray 过滤:在哪种情况下使用谓词,在哪种情况下使用块?

性能方面,在相对较大的数组上(到目前为止,原始数组的通常计数为 ±20000),哪种方法最适合过滤它?块还是谓词?

包含的对象的大多数 ivars 都是字符串,我想查询这些。

0 投票
1 回答
270 浏览

c - 如何使用 clang 为块实现自定义保留释放

我有一个用 C 语言编写的对象系统,其中包含对象的引用计数(对象只是具有 retainCount int 的结构)。如果我有如下块:

然后在调用 Block_copy 时,运行时堆分配整数 i。但是,如果我改用引用计数对象:

然后指针本身,而不是它的引用值,由运行时进行堆分配(尽管它已经由 Object_New 函数进行堆分配)。因为对象是引用计数的,所以另一个函数可能会出现并在释放块之前释放对象。如果我明确地保留该对象,那么它将永远不会被释放。所以,我的问题是,如何向 Block_dealloc 添加回调以在对象被释放时显式释放它?

谢谢。

0 投票
1 回答
3134 浏览

objective-c - Objective-C 快速枚举冒泡排序

我正在尝试将一些 GCD 集成到我的代码中,并且发现严重的瓶颈是我在大型数组中的对象之间执行的气泡比较。这是原始代码:

得到我的漂移?因此,许多其他快速枚举任务可以通过转换轻松地 GCD'd

至:

有没有办法将我的前瞻排序气泡排序算法转换为我可以提供给 GCD 块实现的东西?

0 投票
1 回答
201 浏览

iphone - iPhone 阻止有关访问对象引用的范围混淆

大多数记录在案的块使用示例都演示了使用简单变量的闭包,但我对任何访问周围代码中存在的对象的尝试感到困惑。例如,这会以一种丑陋、无益的方式崩溃:

0 投票
6 回答
43964 浏览

objective-c - 从块内调用 [self methodName]?

我刚刚遇到块,我认为它们正是我正在寻找的东西,除了一件事:是否可以从块中调用方法 [self methodName]?

这就是我想要做的:

我一直在寻找几天,我找不到任何证据表明这是可能的。

这是可能的,还是我试图将块用于它们不适合的东西?

我使用块的原因是我创建了一个 Fader 类,并且我想存储一个块以在它完成淡出时执行。

谢谢

编辑:好的,我在建议中添加了,但我仍然收到 EXC_BAD_ACCESS 错误...

也许我不允许给推子这个功能......?

0 投票
2 回答
395 浏览

iphone - iPhone - 块内方法内的变量

我们知道,如果我们希望一个块能够更改它,我们必须事先使用 __block 声明一个变量。但是,如果我们将块称为

doStuff 中的代码是否受此规则约束?想象一下 doStuff 正在使用在 .h 上声明的变量或属性。这些变量/属性是否需要使用 __block 前缀声明?