我是 ios block 编程的新手,
我读过很多指南,他们说,事情被保留在一个 block 中,
我写了一个演示来测试他们提到的保留周期。
头文件:
typedef NSString* (^MyBlock)(void);
@interface DetailViewController : UIViewController <UISplitViewControllerDelegate>
{
UIView * testView;
SubDetailViewController * tSubDetailViewController;
NSMutableArray * array;
MyBlock block1;
}
m 文件:在
viewDidLoad
:array = [[NSMutableArray alloc] init];
block1 = ^(void){
[array addObject:@"23"];
[self btn2Touch:nil];
return @"3";
};
NSLog(@"self after block retainCount -> %d",self.retainCount);
NSLog(@"array after block retainCount -> %d",array.retainCount);
//self.block1();
[array release];
我以为数组和self会被保留,retatinCount +1;但是无论我是否执行 self.block1(),retainCount 不 +1,一切似乎都很好,数组可以释放,当弹出 View Controller 时,自动释放正常。
我想念导游的东西吗?很好奇这种情况。
任何人都可以给我一个带有 block 的保留循环代码吗?
最佳答案
复制 block 时, block 会保留其捕获的变量。由于您使用的是 MRC,因此编译器不会自动执行任何操作。您将 block 文字直接分配给实例变量 block1
(不是通过属性或其他东西),所以没有复制。
这是对 block 的错误使用,因为任何时候将 block (例如在实例变量中)存储在超出当前范围的地方,都必须复制它。 block 字面量仅在它们定义的范围内有效。这是因为 block 可能从堆栈开始,并且必须被复制才能移动到堆中;否则,它们会在作用域结束时被销毁。因此,如果您尝试使用 block1
指向的 block 完成此功能后,可能会发生不好的事情。
因此,如果您正确使用了 block ,您将复制该 block ,因此该 block 将保留 self
.另外,作为实例变量, block 也应该被self
保留。 ,以遵循内存管理规则。所以你有一个保留周期。
关于IOS block 不保留 self ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18265319/