gpt4 book ai didi

iphone - block 、栈和堆

转载 作者:可可西里 更新时间:2023-11-01 06:12:19 27 4
gpt4 key购买 nike

使用 Xcode 4.2 和 ARC,在我对如何将 block 从堆栈复制到堆有任何了解之前,我编写了以下代码。

-(void) downloadWithBlock:(void (^)(void))callbackBlock;
{
// start the data download in the background...
NSOperation *backgroundOperation = [NSBlockOperation blockOperationWithBlock:^{
// synchronous download code
}];
[backgroundOperationQueue addOperation:backgroundOperation];
NSOperation *foregroundOperation = [NSBlockOperation blockOperationWithBlock:^{
callbackBlock();
}];
[foregroundOperation addDependency:backgroundOperation];
[[NSOperationQueue mainQueue] addOperation:foregroundOperation];
}

代码有效,但我不信任它,因为我不理解它。在另一段代码中,我在不使用 -copy 的情况下调用存储在 ivars 中的 block 时遇到应用程序崩溃。这让我想知道这部分代码是否应该这样重写:

-(void) downloadWithBlock:(void (^)(void))callbackBlock;
{
void(^heapBlock)(void) = [callbackBlock copy];
// start the data download in the background...
NSOperation *backgroundOperation = [NSBlockOperation blockOperationWithBlock:^{
// synchronous download code
}];
[backgroundOperationQueue addOperation:backgroundOperation];
NSOperation *foregroundOperation = [NSBlockOperation blockOperationWithBlock:^{
heapBlock();
}];
[foregroundOperation addDependency:backgroundOperation];
[[NSOperationQueue mainQueue] addOperation:foregroundOperation];
}

我在这里唯一关心的是更好地理解 block 指针的工作原理。这些代码部分中的任何一个都可以接受吗?在另一个 block 中调用一个 block 是否会触发编译器插入隐藏的 Block_copy 操作?

最佳答案

不仅是嵌套block的调用,任何对 block 的直接引用都会导致复制。包括将其作为参数传递给其他东西。 block 中的 ObjC 类型也是如此(除了它是一个简单的保留,而不是它们的副本)。

关于iphone - block 、栈和堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8504372/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com