目标c重新分配点

时间:2010-02-19 00:31:28

标签: objective-c pointers memory-address

由于某种原因,我无法绕过这个......

我有一个带有ivar(值)的类(Model)。我想将值传递给方法并将值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);
}

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

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分: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语言的人都可以澄清。

当然,只需返回一个值即可轻松清除此示例。这个技巧很有用,但我认为在大多数情况下,如果避免使用这种模式,您的代码将更容易理解并且整体更清晰。所以只有在你有充分理由的情况下才使用它,比如你有一个方法返回一个值,但是也希望返回更多可能或可能不重要的值,调用者可以选择捕获它们。但是如果你只是简单地返回一个值并分配它,你可能会做得更好。