Questions tagged «objective-c-blocks»

块是Apple对C的闭包的实现,也可用于Objective-C和C ++。


8
“ __block”关键字是什么意思?
__blockObjective-C 中的关键字到底是什么意思?我知道它允许您修改块内的变量,但我想知道... 它到底告诉编译器什么? 它还有其他作用吗? 如果仅此而已,那么为什么首先需要它? 它在文档中的任何地方吗?(我找不到)。

8
将块内的变量分配给块外的变量
我遇到错误 变量不可分配(缺少__block类型说明符) 就行了aPerson = participant;。如何确保该块可以访问该aPerson变量并且aPerson可以返回该变量? Person *aPerson = nil; [participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { Person *participant = (Person*)obj; if ([participant.gender isEqualToString:@"M"]) { aPerson = participant; *stop = YES; } }]; return aPerson;


7
块声明语法列表
众所周知,Objective C(甚至我认为确实是C)中的块语法是不一致的。将块作为参数传递看起来与将块声明为ivars不同,后者看起来与typedefing块不同。 是否有可供我快速参考的块声明语法的完整列表?

8
实施API时如何避免在块中捕获自我?
我有一个正在运行的应用程序,正在将其转换为Xcode 4.2中的ARC。预检查警告之一涉及self强烈捕获到导致保留周期的块中。我制作了一个简单的代码示例来说明问题。我相信我理解这意味着什么,但是我不确定实现这种情况的“正确”或推荐方法。 self是MyAPI类的实例 下面的代码被简化为仅显示与与我的问题相关的对象和块的交互 假设MyAPI从远程源获取数据,而MyDataProcessor处理该数据并产生输出 处理器配置有块以传达进度和状态 代码示例: // code sample self.delegate = aDelegate; self.dataProcessor = [[MyDataProcessor alloc] init]; self.dataProcessor.progress = ^(CGFloat percentComplete) { [self.delegate myAPI:self isProcessingWithProgress:percentComplete]; }; self.dataProcessor.completion = ^{ [self.delegate myAPIDidFinish:self]; self.dataProcessor = nil; }; // start the processor - processing happens asynchronously and the processor is released in …

10
等待直到执行了两个异步块,然后再启动另一个块
使用GCD时,我们要等到两个异步块执行完毕后再继续执行下一步。最好的方法是什么? 我们尝试了以下操作,但似乎不起作用: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block1 }); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block2 }); // wait until both the block1 and block2 are done before start block3 // how to do that? dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block3 });

9
用块保留“ self”上的循环
恐怕这个问题是很基本的,但是我认为它与许多进入块的Objective-C程序员有关。 我所听到的是,由于块将捕获在其中引用的局部变量作为const副本捕获,self因此,如果要复制该块,则在块内使用会导致保留周期。因此,我们应该用来__block强制直接处理该块,self而不是复制它。 __block typeof(self) bself = self; [someObject messageWithBlock:^{ [bself doSomething]; }]; 而不只是 [someObject messageWithBlock:^{ [self doSomething]; }]; 我想知道的是以下内容:如果是这样,是否有办法避免丑陋(除了使用GC外)?

6
何时使用enumerateObjectsUsingBlock与
除了明显的区别: 使用enumerateObjectsUsingBlock时,你既需要索引和对象 enumerateObjectsUsingBlock当您需要修改局部变量时不要使用(我错了,请参见bbum的答案) 被enumerateObjectsUsingBlock普遍认为是好还是坏的时候for (id obj in myArray)也会工作?优点/缺点是什么(例如,或多或少的性能)?

5
在不使用typedef的情况下声明块方法参数
是否可以在不使用typedef的情况下在Objective-C中指定方法块参数?它必须像函数指针一样,但是如果不使用中间的typedef,我将无法胜出。 typedef BOOL (^PredicateBlock_t)(int); - (void) myMethodTakingPredicate:(PredicateBlock_t)predicate 仅上述编译,所有这些都将失败: - (void) myMethodTakingPredicate:( BOOL(^block)(int) ) predicate - (void) myMethodTakingPredicate:BOOL (^predicate)(int) 而且我不记得我尝试了哪些其他组合。


7
将闭包作为变量存储在Swift中
在Objective-C中,您可以定义块的输入和输出,存储传递给方法的那些块之一,然后在以后使用该块: // in .h typedef void (^APLCalibrationProgressHandler)(float percentComplete); typedef void (^APLCalibrationCompletionHandler)(NSInteger measuredPower, NSError *error); // in .m @property (strong) APLCalibrationProgressHandler progressHandler; @property (strong) APLCalibrationCompletionHandler completionHandler; - (id)initWithRegion:(CLBeaconRegion *)region completionHandler:(APLCalibrationCompletionHandler)handler { self = [super init]; if(self) { ... _completionHandler = [handler copy]; .. } return self; } - (void)performCalibrationWithProgressHandler:(APLCalibrationProgressHandler)handler { ... …


4
__weak和__block引用之间有什么区别?
我正在阅读Xcode的文档,这使我感到困惑: __block typeof(self) tmpSelf = self; [self methodThatTakesABlock:^ { [tmpSelf doSomething]; }]; 以下是从文档中复制的: 块是对其捕获的变量的有力参考。如果 self在块内使用,则该块形成对的强引用self,因此,如果 self对块也有强引用(通常这样做),则会产生强引用循环。为了避免循环,您需要__block在块外创建一个对自身的弱引用(或引用),如上例所示。 我不明白“弱(或__block)”是什么意思? 是 __block typeof(self) tmpSelf = self; 和 __weak typeof(self) tmpSelf = self; 这里完全一样吗? 我在文档中发现了另外一块: 注意:在垃圾回收的环境中,如果将__weak和 __block修饰符都应用于变量,则该块将无法确保其保持活动状态。 所以,我完全不解。

3
如何在Objective-C的属性中存储块?
我想将Objective-C块存储在一个属性中以备后用。我不确定该怎么做,所以我在Google上搜索了一下,关于该主题的信息很少。但是我最终设法找到了解决方案,并且我认为对于像我这样的其他新手来说,值得分享。 最初,我认为我需要手动编写属性才能使用Block_copy和Block_release。 幸运的是,我发现块是NSObjects,- copy/- release等效于Block_copy/ Block_release。因此,我可以@property (copy)用来自动生成setters和getters。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.