IOS块不保留自我?

IOS块不保留自我?,ios,objective-c,block,retain,retain-cycle,Ios,Objective C,Block,Retain,Retain Cycle,我不熟悉ios中的块编程, 我读过很多指南,他们说,东西被保留在一个街区里, 我写了一个演示来测试他们提到的保留周期 头文件: typedef NSString* (^MyBlock)(void); @interface DetailViewController : UIViewController <UISplitViewControllerDelegate> { UIView * testView; SubDetailViewController * tSu

我不熟悉ios中的块编程, 我读过很多指南,他们说,东西被保留在一个街区里, 我写了一个演示来测试他们提到的保留周期

头文件:

typedef NSString* (^MyBlock)(void);

@interface DetailViewController : UIViewController <UISplitViewControllerDelegate>
{

    UIView * testView;

    SubDetailViewController * tSubDetailViewController;

    NSMutableArray * array;

    MyBlock block1;

}
我以为数组和self会被保留,retatinCount+1;但无论我是否执行self.block1(),重新计数不+1,一切都很好,数组可以释放,当弹出视图控制器时,自动释放正常

我是不是错过了导游?这种情况很奇怪。
任何人都可以给我一个块保留循环的代码?

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

这是对块的不正确使用,因为任何时候如果将块(例如,在实例变量中)存储在将超出当前范围的位置,则必须复制它。块文字仅在其定义的范围内有效。这是因为块可能从堆栈开始,必须复制才能移动到堆中;否则,它们将在作用域的末尾被销毁。因此,如果在完成此函数后尝试使用
block1
指向的块,则可能会发生不好的事情


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

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

我读了另一个问题,Bbum说“块仅在复制块时保留捕获的对象。因此,在该示例中,块不会保留self。”我将试一试。我尝试了[self.block1 copy],self被保留(+1),并且array.retaincount仍然为1
块未捕获array
。只有
self
是可用的
array
是一个实例变量,因此只要
array
自身出现,它就隐式地
self->array
。只能“捕获”局部变量。我认为不建议使用mrc。
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];