Objective c 将值赋给id不会';t棒
我正在从文件中读取plist,希望为文件中的值设置一些属性,但前提是这些属性不是nil,因此我想出了一个小方法,但它无法按预期工作:Objective c 将值赋给id不会';t棒,objective-c,Objective C,我正在从文件中读取plist,希望为文件中的值设置一些属性,但前提是这些属性不是nil,因此我想出了一个小方法,但它无法按预期工作: - (void)assignNonNullValue:(id)value to:(id)target { if (value) { target = value; NSLog(@"new value = %@", target); } } // ... NSString *foo = @"a";
- (void)assignNonNullValue:(id)value to:(id)target
{
if (value) {
target = value;
NSLog(@"new value = %@", target);
}
}
// ...
NSString *foo = @"a";
[self assignNonNullValue:@"b" to:foo];
NSLog(@"foo=%@", foo);
我期望得到以下结果:
new value = b
foo=b
但我得到的却是:
new value = b
foo=a
为什么?您正在更改方法中的目标值。它不会影响另一个作用域中foo的值。如果要更改
foo
值,则需要将方法传递到它所指向的位置。因此,当您更改一个方法时,当您更改它所指向的值时,它将影响foo
值。为了澄清我的解释,下面是代码
- (void)assignNonNullValue:(id)value to:(id *)target
{
if(value != nil)
*target = value;
}
由于id
已经是指向对象的指针,因此使用id*
的情况非常罕见。通过将id*
作为参数传递,可以更改其指向的值。所以,它将是永久的
在你做出我指出的改变之后。您需要将此方法称为
[self assignNonNullValue:@"b" to:&foo];
以下是另一种方法:
- (id)valueOrOriginalIfNull:(id)value original:(id)original {
if (value) {
return value;
} else {
return original;
}
}
// ...
NSString *foo = @"a";
foo = [self valueOrOriginalIfNull:@"b" original:foo];
NSLog(@"foo=%@", foo);
原始方法失败的原因是参数是按值传递的。当您将
target
赋值给方法中的另一个值时,它对原始值没有影响。首先您可能应该使用NSMutableString
。您的代码对局部变量有效,但对属性无效:“将非局部对象的地址传递给u自动删除参数以进行写回”。如果您使用的是属性,您可以使用self访问并为属性赋值,为什么还要麻烦使用方法呢?您应该指出,此解决方案需要更改方法的调用方式<代码>[self-assignNonNullValue:@“b”到:&foo]代码>