在objective-c块中捕获变量的概念有问题

时间:2016-01-24 12:46:11

标签: objective-c objective-c-blocks

我已经阅读了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();

3 个答案:

答案 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