当您复制块时,如有必要,将复制该块内对其他块的任何引用- 可以复制整个树(从顶部)。如果您有块变量并且从块内引用块,则该块将被复制。
粗略翻译如下:
测试对象:`RXBlockBlockObject`
@interface RXBlockBlockObject : NSObject- (void)test;@end `RXBlockBlockObject.m` 文件:
@interface RXBlockBlockObject()@property (非原子,复制) int(^block)(int);@property (非原子,分配) int tmpValue;@end@implementation RXBlockBlockObject- (void)test{ [self _test_block_normal];//[ self _test_block_nested_retain_cycle];//[self _test_block_nested];}- (void)dealloc{ NSLog(@'RXBlockBlockObject dellloc');}@end 测试类:
- (void)_test_block{ RXBlockBlockObject *tmp=[RXBlockBlockObject new]; [tmp测试]; //tmp 将被释放}
`_test_block_normal` method
- (void)_test_block_normal{ self.tmpValue=10; self.block=^(int m) { return m + 4; }; void (^block1)(void)=^{ NSLog(@'%zd', self.block(5)); }; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2) * NSEC_PER_SEC)),dispatch_get_main_queue(), block1);} 持有关系描述如下:
self(viewController) 保存了block,dispatch_after 的全局管理器保存了block1,block1 保存了self,不存在循环引用。
输出如下:
9RXBlockBlockObject dellloc
`_test_block_nested_retain_cycle` method
- (void)_test_block_nested_retain_cycle{ self.tmpValue=10; //A(self)对B(block)强引用,B对C(block1)强引用,C对A(self)强引用,导致循环引用self.block=^( int m) { //内联块void (^block1)(void)=^{ //不会提示警告,但实际上发生了循环引用NSLog(@'%zd' , self.tmpValue + m); //warning: 在这个块中强捕获'self'很可能会加载到一个保留周期//但感觉这是一个无限递归调用~~~~ //NSLog(@'% zd', self.block(10 )); }; dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(2 * NSEC_PER_SEC)),dispatch_get_main_queue(),block1);返回m+4; }; void (^block2)(void )=^{ NSLog(@'%zd', self.block(5)); }; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)),dispatch_get_main_queue(), block2);} 持有关系如下注释中说明:
A(`self`)对B(`block`)有强引用,B对C(`block1`)有强引用,C对A(`self`)有强引用,导致循环引用。
输出是:
915 dealloc不会被调用,发生循环引用,内存泄漏。
`_test_block_nested` method 上一个的进化版本,解决循环引用
- (void)_test_block_nested{ self.tmpValue=10; __weak __typeof(self)weakSelf=self; self.block=^(int m) { //内联块__strong __typeof(self)strongSelf=weakSelf; void (^ block1)(void)=^{ NSLog(@'%zd', StrongSelf.tmpValue + m); }; dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(2 * NSEC_PER_SEC)),dispatch_get_main_queue(),block1);返回m+4; }; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{ NSLog(@'%zd', self.block(5)); });}使用`__weak`和`__strong`解决了,`block2`延长了`self`的生命周期
输出结果:
标题:Blocks中嵌套块时的注意事项
链接:https://www.gbbxw.com/news/rj/20291.html
版权:文章转载自网络,如有侵权,请联系删除!
用户评论
在这个游戏中,我发现了一个奇妙的世界,并且我开始了解在嵌套块中的操作确实需要耐心和策略。令人惊讶的是,这竟然是提高我在逻辑思考能力的一种方式。
有10位网友表示赞同!
如果想要在"Block中嵌套block"中取得成功,你必须将所有的规则牢记于心。这个过程让我意识到了游戏与编程的有趣联系。
有20位网友表示赞同!
"Block中嵌套block"是一款挑战玩家空间感知和规划技能的游戏。我发现每次失败都是为了更好地理解如何构建更复杂的结构。
有18位网友表示赞同!
在玩"Block中嵌套block"时,我惊讶于它的直观性和深度,即使是简单的规则也引导出复杂且精妙的逻辑模式。
有6位网友表示赞同!
"Block中嵌套block"对我来说是种享受,这个游戏教会我在压力下保持专注和解决问题的能力,每一次尝试都让我更加聪明了。
有17位网友表示赞同!
我喜欢在"Block中嵌套block"中的体验,特别是当我和朋友一起玩时,我们都在尝试看谁可以更巧妙地处理更多的块。
有11位网友表示赞同!
我认为"Block中嵌套block"不仅是个游戏,更像是一本教科书教我如何构建和分解复杂的物体。我的空间理解能力已经大大提升。
有7位网友表示赞同!
这款游戏的精髓在于它的简洁性和深度,每一块小砖头都透露出对玩家智力的挑战。它比看起来更加复杂,并且充满乐趣。
有20位网友表示赞同!
"Block中嵌套block"是一个完美的混合体:既有趣又有教育意义。我喜欢这种类型的游戏,因为它们不仅让我娱乐还启发我思考。
有5位网友表示赞同!
在玩了"Block中嵌套block"一段时间后,我发现我开始用新的眼光看待现实中的问题和解题办法,游戏对我的思维方式产生了积极的影响。
有15位网友表示赞同!
"Block中嵌套block"是我最喜欢的游戏之一。每当我解开一个难题时,成就感让我热泪盈眶,我强烈推荐这款游戏给所有喜爱挑战的朋友。
有13位网友表示赞同!
我对"Block中嵌套block"的体验是既激动人心又富有挑战性的。我发现这个游戏不仅提升了我的逻辑思维能力,还增加了我的耐心。
有6位网友表示赞同!
"Block中嵌套block"提供了惊人的可视化学习,我能够直观地看到问题解决的过程和技巧的重要性。这是个伟大的工具来增强抽象思考。
有12位网友表示赞同!
在尝试通过"Block中嵌套block"来构建更复杂的图案时,我发现了一种全新的、创造性的解决问题的方式,这个游戏真的很有启发性。
有15位网友表示赞同!
"Block中嵌套block"是一款让我每天都能享受智力挑战的出色游戏。我相信它对于提高逻辑推理能力非常重要。
有7位网友表示赞同!
我从"Block中嵌套block"中学到了很多关于空间关系和结构构建的知识,每个失败都是一次学习的机会,这让我在玩的过程中学到了很多。
有9位网友表示赞同!
"Block中嵌套block"是一个寓教于乐的杰作。每次成功搭建新的块布局都像是一种小胜利,激励我不断探索更难的挑战场景。
有6位网友表示赞同!
我发现这个游戏中的每个规则都是一门艺术,在实践中学习和运用这些规则,对我的思维和反应速度有很大帮助。
有13位网友表示赞同!
"Block中嵌套block"不仅是一款游戏,更是对耐性和创意的一种考验。我喜欢这种类型的思维锻炼,并从中获得了极大的满足感。
有12位网友表示赞同!