为了让我的代码变干,我正在编写以下代码。
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时复制它们?
答案 0 :(得分:0)
这与NSString
或阻止(具体)无关。 Objective-C中的所有参数都按值传递。对于块,方法和函数都是如此。
所有方法,函数和块参数本质上都是局部变量。当你这样做时:
item = text;
在块的末尾,您所做的只是更改局部变量item
指向的对象。这绝不会改变用于调用块的值。
在块外部更改值的唯一方法是使用“out”参数。这是通过将指针传递给值来在Objective-C中完成的。
在许多采用NSError **
参数的方法中都可以找到一个常见的例子。请注意,它是指向NSError
的指针。