需要帮助了解__block存储类型

时间:2013-10-01 09:51:36

标签: objective-c objective-c-blocks

__block NSString *x = @"123"; //  x lives in block storage
void (^printXAndY)(NSString*) = ^(NSString *y) {
    x = [x stringByAppendingString:y];
    printf("%@ %@\n", x, y);
};
printXAndY(@"456");

Apple docs说:

  

__block存储类型您可以指定导入的变量   可变 - 即读写 - 通过应用__block存储类型   改性剂。

如果x是可变的,那么x = [x stringByAppendingString:y];是不是错了?并可能导致内存泄漏?

1 个答案:

答案 0 :(得分:3)

首先,你混淆了两个完全不相关的东西:1)变量是可分配的(即非const),2)如果变量是对象指针类型, 指向的对象是“可变的”。

__block局部变量在块内const,这意味着您无法执行x = something。使变量__block允许您在块内执行x = something(无论x的类型如何)。当x是指针变量时,对它的赋值使它指向其他东西。

所谓的“变异”一个“可变”对象只是意味着你可以在它上面调用某种方法来改变对象的“内容”。它不涉及分配任何可能指向此对象的指针。


关于你的第二个问题,内存泄漏,不,不应该有任何内存泄漏。首先,如果您使用ARC,很明显没有泄漏。即使您使用的是MRC,也没有泄漏。实际上,如果这是MRC,那么您的函数中不会保留此代码中的任何对象指针(它们不是retainallocnew,{{1等等),所以不可能有泄漏。