gpt4 book ai didi

objective-c - block 内存管理

转载 作者:搜寻专家 更新时间:2023-10-30 20:23:12 25 4
gpt4 key购买 nike

在此 Apple 引用资料中,有对 objective-c 中 Blocks 对象的概念性概述:

http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Blocks/Blocks.pdf

然而,它并没有真正解释我关心的和其他人可能关心的两个话题。第一个问题是这样的:我可以将 nil 分配给 Block 引用吗?还是应该使用 NULL?或者我可以两者都不用吗?

第二个问题在于内存管理领域。比方说,我已经声明了这样一个在堆栈上创建 block 对象的方法。

-(void)makeTheClass
{
TheClass *object = [[TheClass alloc] init];

object.blockReference = ^(void) { return nil; }
}

这个对象,在某个范围内被创建,在离开它之后将被销毁。但是 TheClass 对象实际上将存储对这个(几乎被破坏的) block 的引用:

typedef id (^WeirdBlockType)(void);

@interface TheClass {
WeirdBlockType blockReference;
}

如何为这样的 block 声明类属性?这两者有什么区别:

@property (nonatomic, retain) WeirdBlockType blockReference;
@property (nonatomic, copy) WeirdBlockType blockReference;

?

Apple 文档中明确指出, block 复制会将 block 移动到。但如果我只是保留它呢?它会在超出 makeTheClass 方法范围后被销毁吗?

最佳答案

好吧,我找到了解决方案。感谢 Gojan 的回答,但他其实有一处错误:

Wevah 是对的。 在 block 上保留没有任何效果,直到它完全移动到堆中,并且只有 Block_copy 完成这样的任务。

也许 block 不是唯一不能在堆栈上保留的对象;但是当你在堆上创建(allocinit)任何 NSObject 子类实例时默认情况下,你不会不用管它 - retain 照常工作。 block 对象默认情况下在堆栈上创建,这就是工作有点出乎意料的原因。

谢谢大家!

关于objective-c - block 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4172364/

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