Objective c 将值赋给id不会';t棒

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";

我正在从文件中读取plist,希望为文件中的值设置一些属性,但前提是这些属性不是nil,因此我想出了一个小方法,但它无法按预期工作:

- (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]