在作为块的参数传入时是否复制了NSString?

时间:2015-08-07 12:53:05

标签: ios objective-c nsstring

为了让我的代码变干,我正在编写以下代码。

void (^setItemAndClearCounterpart)(id, id, id) = ^(id item, id counterpart, id text){

    if ([text length] > 0 && ![text isEqualToString:@"default"]) {
        counterpart = @"default";  // Here we change the "counterpart" passed in
    }
    if ([text length] == 0) {
        text = @"default";
    }
    item = text;  // Here we change the "item" passed in
};

                 // These items in the array are NSString
NSArray *itemArr = @[_settings.selfPushSound,   _settings.selfBgImage,   _settings.selfBgSound,
                     _settings.commonPushSound, _settings.commonBgImage, _settings.commonBgSound];

setItemAndClearCounterpart( itemArr[ (alertView.tag + 3) % 6 ],
                            itemArr[  alertView.tag      % 6 ],
                            text);
// PROBLEM: properties of _settings (eg. _settings.selfPushSound ) not changed by the block

然而,似乎我传入的NSStrings没有像我想的那样被块改变。

我想知道NSStrings在作为块的参数传入时是否被复制了?或者,如果在将它们添加到NSArray时复制它们?

1 个答案:

答案 0 :(得分:0)

这与NSString或阻止(具体)无关。 Objective-C中的所有参数都按值传递。对于块,方法和函数都是如此。

所有方法,函数和块参数本质上都是局部变量。当你这样做时:

item = text;

在块的末尾,您所做的只是更改局部变量item指向的对象。这绝不会改变用于调用块的值。

在块外部更改值的唯一方法是使用“out”参数。这是通过将指针传递给值来在Objective-C中完成的。

在许多采用NSError **参数的方法中都可以找到一个常见的例子。请注意,它是指向NSError的指针。