@interface ToolDemoViewController ()
{
BOOL isSuccess;
{
BOOL isSuccess;
void (^testBlock2)(NSString *str);
}
@property (strong, nonatomic) NSString *testName;
@property (nonatomic, copy) void (^testBlock)(NSString *str);
#pragma mark - 测试循环引用
- (void)testWeakAction {
// 这里不需要 __weak
[UIView animateWithDuration:0.3 animations:^{
self.view.backgroundColor = [UIColor redColor];
self.testName = @"sadgf";
}];
// 这里不需要 __weak
dispatch_async(dispatch_get_main_queue(), ^{
self.view.backgroundColor = [UIColor blueColor];
self.testName = @"dddd";
});
// 这里需要 __weak
__weak typeof(self) wSelf = self;
testBlock2 = ^(NSString *str) {
NSLog(@"===%@",wSelf.testName);
};
// 测试调用
if (self.testBlock) {
self.testBlock(@"测试");
}
if (testBlock2) {
testBlock2(@"ddd");
// 这里不需要 __weak
[UIView animateWithDuration:0.3 animations:^{
self.view.backgroundColor = [UIColor redColor];
self.testName = @"sadgf";
}];
// 这里不需要 __weak
dispatch_async(dispatch_get_main_queue(), ^{
self.view.backgroundColor = [UIColor blueColor];
self.testName = @"dddd";
});
// 这里需要 __weak
__weak typeof(self) wSelf = self;
testBlock2 = ^(NSString *str) {
NSLog(@"===%@",wSelf.testName);
};
// 测试调用
if (self.testBlock) {
self.testBlock(@"测试");
}
if (testBlock2) {
testBlock2(@"ddd");
}
void (^testTempBlock) (NSString * str);
// 这里不需要 __weak
testTempBlock = ^(NSString *str) {
NSLog(@"%@",self.testName);
};
// 测试方法里面的block的调用
if (testTempBlock) {
testTempBlock(@"xiao");
// 这里不需要 __weak
testTempBlock = ^(NSString *str) {
NSLog(@"%@",self.testName);
};
// 测试方法里面的block的调用
if (testTempBlock) {
testTempBlock(@"xiao");
}
// block里面有延迟的时候需要特殊处理
self.testBlock = ^(NSString *str) {
ToolDemoViewController *strongSelf = wSelf;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 页面返回上个页面后,才执行,就会为空了。。。
NSLog(@"name111===%@,,,%@",strongSelf.testName,str);
});
};
if (self.testBlock) {
self.testBlock(@"xiaoming");
}
}
相关推荐
本资料包“ios-block循环引用的三种解决办法.zip”旨在探讨这个问题并提供解决方案。 一、循环引用的概念与危害 循环引用发生在两个或多个对象彼此强引用,导致它们都不能被正常释放,即使它们已经不再使用。在...
在iOS开发中,Block是一种强大的闭包特性,它允许...总结,理解和妥善处理Block的循环引用是iOS开发中的关键技能,它关系到应用的性能和稳定性。通过以上介绍,我们可以更好地识别和解决这类问题,确保代码健康高效。
7. **避免Block循环引用( retain cycle)** - 当Block内部引用了强引用自身实例的属性时,可能导致循环引用,应使用弱引用`__weak`来避免。 - 对于ARC环境下,可以使用`weakSelf`和`strongSelf`技巧来安全地访问...
然而,随着编程复杂性的增加,开发者经常遇到内存管理问题,其中之一就是"Block循环引用"。Block是OC中的一种强大的特性,它允许我们在代码中定义可重用的匿名函数。然而,如果不正确地使用,Block可能会导致内存...
当Block作为对象的属性或者成员变量时,如果不小心可能会引起循环引用,导致内存泄漏。为了避免这种情况,可以使用`__weak`修饰符来弱引用self,或者使用`__unsafe_unretained`。 8. **Block与 ARC** 自动引用...
由于Block会捕获并持有其定义时的引用,因此可能导致循环引用,尤其是在ARC(Automatic Reference Counting)环境下。为了避免循环引用,可以使用弱引用`__weak`或强引用`__strong`来管理Block内的对象引用。 ### 7...
下面一段代码给大家介绍iOS MRC 下 block 循环引用问题 //注意此__block会复制一份指针出来 一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针 __block __typeof(self)weakSelf = self; //__weak _...
在iOS面试中,面对关于Block导致循环引用的问题,你需要展现出深度理解和实践经验,而不仅仅是复述常见解决方案。首先,理解循环引用的基本概念至关重要:当两个对象互相强引用时,导致它们都不能被正确释放,这就...
- id __block __weak:如果Block被复制到堆上,引用会变为弱引用,防止循环引用。 - Block __attribute__((__blocks__(byref))):Block被直接存储在堆上。 二、Block的声明与使用 1. Block声明:使用 "^" 符号...
因此,使用时应谨慎处理Block中的强引用循环,确保及时释放不再使用的资源。 总的来说,这个示例提供了一种在iOS应用中方便地跨界面传递和执行Block的方法,减少了对代理模式的依赖,提高了代码的灵活性。然而,...
代理需要定义协议,实现方法,有时还需要处理弱引用以避免循环引用。 3. **捕获能力**:Block能捕获和存储上下文中的变量,代理则不能。 4. **生命周期**:Block可以作为成员变量存储,其生命周期与对象相同;代理...
需要注意的是,Block捕获的自动变量如果是对象类型,会遵循ARC的强引用计数规则,可能导致循环引用问题。解决这个问题通常需要使用`__weak`或`__unsafe_unretained`关键字来弱引用捕获的对象。 总之,Block是...
但需要注意的是,如果Block引用了循环引用的对象,可能会导致内存泄漏。为了避免这种问题,可以使用弱引用(__weak)或无主引用(__unsafe_unretained)。 总的来说,iOS的Block回调使得代码更加简洁、易读,减少了...
然而,如果不正确地使用Block,可能会导致循环引用(retain cycle),进而引发内存泄露。本文将深入探讨Block引起的循环引用问题,提供示例并分享解决方案。 一、什么是循环引用? 循环引用是指两个或多个对象互相...
当block内部引用了Objective-C对象时,可能会发生循环引用的问题,尤其是当block被某个对象持有时。为了解决这个问题,开发者可以使用Block_copy和Block_release函数来管理block的内存。 总结起来,block为iOS开发...
**iOS Block基础使用** 在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义局部函数,可以作为参数传递,也可以...正确理解Block的生命周期、捕获变量、循环引用等问题,有助于编写出更健壮的iOS应用。
2. __weak Block:为防止循环引用,可以使用弱引用Block,但需要注意弱引用可能导致Block内部的变量提前释放。 3. __block变量:对于Block内部需要修改的局部变量,需要声明为`__block`类型,这样变量在Block内可以...
Block会捕获并保留其作用域内的对象,因此可能导致循环引用。为了避免这种情况,可以使用弱引用`__weak`或者`__unsafe_unretained`关键字。同时,如果Block在栈上创建,可能会被自动释放,需要将其复制到堆上以确保...