__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];
是不是错了?并可能导致内存泄漏?
答案 0 :(得分:3)
首先,你混淆了两个完全不相关的东西:1)变量是可分配的(即非const
),2)如果变量是对象指针类型, 指向的对象是“可变的”。
非__block
局部变量在块内const
,这意味着您无法执行x = something
。使变量__block
允许您在块内执行x = something
(无论x
的类型如何)。当x
是指针变量时,对它的赋值使它指向其他东西。
所谓的“变异”一个“可变”对象只是意味着你可以在它上面调用某种方法来改变对象的“内容”。它不涉及分配任何可能指向此对象的指针。
关于你的第二个问题,内存泄漏,不,不应该有任何内存泄漏。首先,如果您使用ARC,很明显没有泄漏。即使您使用的是MRC,也没有泄漏。实际上,如果这是MRC,那么您的函数中不会保留此代码中的任何对象指针(它们不是retain
,alloc
,new
,{{1等等),所以不可能有泄漏。