我已经阅读了str
变量,这里的变量只能在块中读取。
但是当我在其上调用appendString
方法时,变量str
被修改了!怎么样?
NSMutableString *str = [NSMutableString stringWithFormat:@"Hi, My name is "];
int k=2;
void (^testBlock)(void) = ^(void)
{
k = k*2; //Error as expected
[str appendString:@"Mickey Mouse"]; //no Error!!
}
testBlock();
答案 0 :(得分:0)
可以说块不允许更改指针(地址),但允许修改对象值(不是存储指向对象的指针的变量值)。
例如,您可以更改可变对象,如可变字符串(追加字符串)和可变数组(插入/更新/删除)。但是,如果没有__block
修饰符,则无法在块内重新指定指向不可变数组的指针。
此处的可变对象的行为类似于块内的属性/ ivars。
答案 1 :(得分:0)
变量str
未被修改,它仍具有相同的值 - 即它指向相同的内存地址。请尝试NSLog(@"%p",str)
自己查看。
对appendString:
的调用改变的是存储在str
指针引用的地址的内容。指针值不会改变,这就是为什么你似乎可以操纵str
的值。
作为练习,请尝试添加类Person
并使用它的实例而不是字符串。您可以更改该对象的各种属性,但仍然可以在同一个实例上运行。
答案 2 :(得分:0)
int a = 10;
/*within the block */
a = a/5;
//prohibited without a __block storage specifier
现在看看,
int a =10;
int *b= &a;
/*within the block */
*b = (*b)/5;
//No Error. The value at the address was only changed but the pointer b is still pointing to the same address viz &a