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

苹果文档说:

__block 存储类型 您可以通过应用 __block 存储类型修饰符来指定导入的变量是可变的(即读写)。

如果x是可变的,这不是x = [x stringByAppendingString:y];错的吗?并会导致内存泄漏?

4

1 回答 1

3

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

__block局部变量const在块内,这意味着你不能做x = something. 制作变量__block允许您x = something在块内执行操作(无论 的类型如何x)。当x是一个指针变量,对它的赋值使它指向别的东西。

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


至于你的第二个问题,内存泄漏,不,不应该有任何内存泄漏。首先,如果你使用 ARC,很明显没有泄漏。即使您使用的是 MRC,也没有泄漏。实际上,如果这是 MRC,则此代码中的任何对象指针都没有被您的函数保留(它们不是 , , , 等的结果retainallocnew因此copy不可能存在泄漏。

于 2013-10-02T20:26:05.227 回答