IOS block 不保留 self ?

标签 ios objective-c block retain retain-cycle

我是 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/

相关文章:

ios - 如何访问公共(public)方法 objective-c 中的属性

magento - 通过local.xml文件更改 block 的顺序

matlab - 将图像分成3*3的 block

ios - 嵌套的 Firebase 完成 block

ios - 如何在 AVCaptureSession 上设置音频采样率?

ios - 创建自定义 UIImagePickerController

iphone - Dev、AdHoc 和 App Store 构建的不同设置

ios - 无法在启动时隐藏状态栏

iphone - 参数列表语法

iphone - iOS 中的当前和更新时间?