2

我是 ios 块编程的新手,我读过很多指南,他们说,东西被保留在一个块中,我写了一个演示来测试他们提到的保留周期。

头文件:

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,一切似乎都很好,数组可以释放,当弹出视图控制器时,自动释放正常。

我想念导游的东西吗?很好奇这种情况。任何人都可以给我一个带有块的保留循环代码吗?

4

2 回答 2

1

复制块时,块会保留其捕获的变量。由于您使用的是 MRC,因此编译器不会自动执行任何操作。您将块文字直接分配给实例变量block1(而不是通过属性或其他方式),因此不会进行复制。

这是对块的错误使用,因为任何时候您将块(例如在实例变量中)存储在超出当前范围的地方,您都必须复制它。块字面量仅在它们定义的范围内有效。这是因为块可能从堆栈开始,并且必须被复制才能移动到堆中;否则,它们会在作用域结束时被销毁。所以如果你在这个函数完成后尝试使用指向的块block1,很可能会发生不好的事情。

因此,如果您正确使用了块,您将复制该块,因此该块将保留self. 此外,作为实例变量,块也应该被 保留self,以遵循内存管理规则。所以你有一个保留周期。

于 2013-08-16T09:31:07.923 回答
-1

该块在堆栈中,堆栈中的块不会在其主体中保留对象。相反,堆中的块将在其主体中保留对象。

于 2015-11-05T08:03:04.840 回答