我是ios中块编程的新手, 我读了许多指南,他们说,事情被保留在一个街区, 我写了一个演示来测试他们提到的保留周期。
头文件:
typedef NSString* (^MyBlock)(void);
@interface DetailViewController : UIViewController <UISplitViewControllerDelegate>
{
UIView * testView;
SubDetailViewController * tSubDetailViewController;
NSMutableArray * array;
MyBlock block1;
}
m file:in 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];
我认为数组和自我将被保留,retatinCount +1;但无论我是否执行self.block1(),keepCount都不是+1,一切似乎都很好,数组可以释放,当弹出视图控制器时,正常自我释放。
我会错过指南吗?对这种情况如此好奇。 任何人都可以给我一个保留周期代码?
答案 0 :(得分:1)
块在复制块时保留其捕获的变量。由于您使用的是MRC,因此编译器不会自动执行任何操作。您正在将块文本直接分配给实例变量block1
(而不是通过属性或其他内容),因此不会进行复制。
这是块的错误使用,因为任何时候将块(例如在实例变量中)存储在将超出当前范围的位置,您必须复制它。块文字只在它们定义的范围内有效。这是因为块可能从堆栈开始,必须复制才能移入堆中;否则,它们会在范围的最后被销毁。因此,如果在完成此功能后尝试使用block1
指向的块,则可能会发生错误。
因此,如果您正确使用了块,则会复制块,因此块将保留self
。此外,作为实例变量,块也应由self
保留,以便遵循内存管理规则。所以你有一个保留周期。
答案 1 :(得分:-1)
这个块在堆栈中,堆栈中的块不会在其体内保留对象。相反,堆中的块将在其体内保留对象。