1

由于某种原因,我无法解决这个问题......

我有一个带有 ivar(值)的类(模型)。我想将值传递给方法并将值 ivar 更改为指向其他内容。这会将 aValue 更改为指向 newString。那么,如何让 model.value 指向 newString 而无需说model.value = newString

(void)applicationDidFinishLaunching:(NSNotification *)aNotification {
 Model * model = [[Model alloc] init];//model.value gets set in init
 [self doSomething:model.value];
 NSLog(@"changed?  %@", model.value);
}

- (void)doSomething:(NSString *)aValue
{
 NSString * newString = [[NSString alloc] initWithString:@"new string"];
 aValue = newString;
 NSLog(@"changed? %@", aValue);
}

另外,如何让这个该死的代码块正常工作?

4

2 回答 2

1

使用 更新属性有什么问题model.value=newString?如果你真的想doSomething:修改它的字符串参数,你需要传递一个指向变量的指针:

- (void)doSomething:(NSString **)aValue
{
    [*aValue release];

    NSString * newString = [[NSString alloc] initWithString:@"new string"];
    *aValue = newString;
    NSLog(@"changed? %@", *aValue);
}

并这样称呼它:

[self doSomething:&value];

但这不是很地道。只返回一个值并让调用者决定如何管理结果可能更简洁:

- (NSString*)doSomething
{
    NSString * newString = [[NSString alloc] initWithString:@"new string"];
    NSLog(@"changed? %@", *aValue);
    return [newString autorelease];
}
于 2010-02-19T01:27:15.333 回答
0

您需要传入指向 ivar 的指针,而不是 ivar 本身。

[self doSomething:&model.value];

并像这样创建您的方法:

- (void)doSomething:(NSString**)aValue {
    *aValue = @"new string";
}

所以当你这样做时

NSString *foo = @"old string";
[self doSomething:&foo];
NSLog(@"foo is: %@", foo);

foo的值为@"new string"

您正在接受指向对象的指针,并使其指向不同的对象。通常,该函数获取它自己的指针,并且您为其分配一个新值在创建它的范围之外没有任何影响。

我实际上不确定它的正式名称是什么,但我很确定它是这样工作的。任何更精通C的人都可能会澄清。

当然,这个例子很容易通过简单地返回一个值来清理。这个技巧很有用,但我认为在大多数情况下,如果你避免这种模式,你的代码会更容易理解并且整体上更简洁。所以只有在你有充分理由的情况下才使用它,比如你有一个返回值的方法,但又想返回更多的值,这些值可能很重要,也可能不重要,调用者可以选择性地捕获这些值。但是,如果您可以简单地返回一个值并分配它,那么您这样做可能会更好。

于 2010-02-19T01:26:17.253 回答