IOS阻止不保留自己?

时间:2013-08-16 03:22:52

标签: ios objective-c block retain retain-cycle

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

我会错过指南吗?对这种情况如此好奇。 任何人都可以给我一个保留周期代码?

2 个答案:

答案 0 :(得分:1)

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

这是块的错误使用,因为任何时候将块(例如在实例变量中)存储在将超出当前范围的位置,您必须复制它。块文字只在它们定义的范围内有效。这是因为块可能从堆栈开始,必须复制才能移入堆中;否则,它们会在范围的最后被销毁。因此,如果在完成此功能后尝试使用block1指向的块,则可能会发生错误。

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

答案 1 :(得分:-1)

这个块在堆栈中,堆栈中的块不会在其体内保留对象。相反,堆中的块将在其体内保留对象。