问题标签 [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.
objective-c - msg_send 调用会产生多少开销?
我正在尝试拼凑并运行用户放在一起的任务列表。这些任务列表可能有数百或数千个项目。
据我所知,最简单和最明显的方法是构建一个数组,然后遍历它们:
对于台式机,这可能没问题,但对于 iphone 或 ipad,这可能是个问题。这是实现它的好方法,还是有更快的方法来完成同样的事情?
我询问 msg_send 发生多少开销的原因是我也可以直接进行 C 实现。例如,我可以将一个链表放在一起,并使用一个块来处理下一个任务。我会从中得到什么,还是真的比它的价值更麻烦?
objective-c - 类型而不是变量之间的脱字符号,用括号括起来
我正在浏览 Apple 的文档,我看到了类似这样的内容(void (^)(void))
。有人能解释一下这句话是什么意思吗?^
是异或,对吧?void XOR void
对我来说没有多大意义?
还有类似的东西(void (^)(BOOL finished))
iphone - 在返回到其他对象的块中使用 ivar
我在目标 iOS 4 的 iPhone 应用程序中发现了崩溃,该崩溃取决于构建类型。
调试器没有给我太多继续,它停在
使用 EXC_BAD_ACCESS。self
是一个继承自 NSObject 的类(如下所示为 NSObjectInheritor)。僵尸已启用。我尝试factory
了三种方法更改方法,结果如下。
这在调试和临时构建中都会崩溃......
这在调试版本中有效,但在临时崩溃中...
这适用于调试和临时,但非常丑陋和冗余:
我的理论是boolValue
在执行返回的块时变得无法访问。这是
(YES
或者NO
当然是在 SubclassOfNSObjectInheritor 的 init 中分配)和
在 SubclassOfNSObjectInheritor 的实现中。
最后的问题是——我关于错误的理论是否正确?第三种方式——即在临时和调试版本中工作——安全吗?做这个的最好方式是什么?
iphone - 在块 iPhone SDK 中引用自己
我正在尝试实现一个回调机制,在该机制中我将一个块传递给一个类的 init,然后经过一些工作,该类将我回叫。该块被调用并且大多数东西都正常工作,除非我在块内的“self”上调用任何东西。我收到程序接收信号:“EXC_BAD_ACCESS”,除非我注释掉块内对 self 的任何引用。
我认为我可以在块内访问 self 是错误的吗?任何建议将不胜感激。这段代码在一个全新的“通用应用程序”中,我目前正在研究 iPad 部分,所以在 iPad 模拟器下运行。
一些代码:
这是来自 LoginAlertView 的一些代码
和回调电话
我改为以下代码行
至
这向我展示了以下错误
另一件事,我的块的定义看起来像这样
成员变量是这个
还尝试将块的声明向上移动到一个变量,并将其传入。这具有相同的结果任何时候我在块上使用“副本”,我都会收到可怕的程序接收信号:“EXC_BAD_ACCESS”。我想这可能是IOS3.2的东西,所以我尝试在iPhone 4.0模拟器下运行它,结果相同。是否可能需要进行编译器设置才能将块“复制”到堆上?我正在使用 LLVM1.5
objective-c - 块引用作为Objective-C中的实例变量
我想知道是否可以将匿名函数(块)的引用存储为 Objective-C 中的实例变量。
我知道如何使用委托、目标动作等。我不是在谈论这个。
iphone - UIView.h 中 '^' 标记之前的语法错误 - 无法通过更改编译器设置来修复
我安装了最新的官方 iphone sdk,现在我的个人项目在 UIView.h 中遇到了与此问题中描述的相同的编译器错误: '^' 标记之前的语法错误
'^' 标记前的语法错误
解决方案显然是更改编译器设置以使用 GCC 4.2 或 LLVM。我已经尝试使用 Xcode 中可用的每个编译器设置,但仍然出现错误。
我还应该做些什么来支持我的项目中的 (^) 块语法。该项目在之前的官方 sdk 版本(OS4 之前)中构建良好
另一个奇怪的细节,我只在调试配置中得到错误,而不是发布。我尝试比较调试和发布之间的构建设置,但没有发现任何重大差异。在存在差异的地方,我尝试将调试配置设置为使用发布配置值,但仍然出现这些错误。
提前感谢您的帮助
iphone - 从 NSArray 执行块?
我只是在想,因为如果我创建两个块然后将它们添加到 NSArray 中,您可以将块视为对象,有没有办法从数组中执行它们?
编辑:更新清晰每@davedelong的优秀答案
objective-c - 有没有办法序列化/反序列化一个 Objective-C 块?
我正在编写一个需要支持“促销”的应用程序,这些促销可能非常复杂,并且许多不同的数据可能与他们的计算相关。因此,在开发的早期阶段,我不想为这些东西发明一个完整的规范模式,我宁愿只用 Objective-C 编写每一个,然后以某种方式将编译后的代码序列化到(CoreData)数据库中供以后召回和执行。
这有可能吗?我在想 GCD 块可能是一个很好的候选者,尽管我不知道有任何开箱即用的方法来序列化/反序列化它们。
感谢您的任何建议。
编辑:这是一个 iPhone 应用程序,所以不幸的是我不能使用 Python 函数酸洗之类的东西......它必须是直接的 Objective-C ......
iphone - iOS 4 GCD 问题
我查看了 WWDC 2010 的一些演示文稿,还阅读了大部分关于块和并发的文档,并且有几个关于在 Grand Central Dispatch 中使用带有串行队列的块的问题。我有一个 iOS 4 项目,它有一个滚动视图和一个图像信息字典——图像的 URL 等等。我想使用 GCD 和块来下载图像并将它们放在我的滚动视图中,因此不会阻塞主线程。我编写了以下似乎有效的代码:
我有两个问题:
根据并发指南,我不应该从封闭范围中捕获非标量类型的变量 - 在我的代码中,我捕获 dict 这是一个 NSDictionary* 对象。如果我不允许捕获它,我应该如何编写代码?块是否仅捕获实际使用的封闭范围中的变量?
如果我在通过串行调度队列获取所有图像之前离开当前的 ViewController 会发生什么?我不认为他们知道创建它们的 ViewController 已经消失了,所以当他们执行完成处理程序时会发生什么,我将图像视图插入到主线程上的滚动视图中?它会导致错误还是什么?当我的 ViewController 消失时,如何取消串行队列上的任何剩余操作?
此致,