由于某种原因,我无法绕过这个......
我有一个带有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代码块正常工作?
答案 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语言的人都可以澄清。
当然,只需返回一个值即可轻松清除此示例。这个技巧很有用,但我认为在大多数情况下,如果避免使用这种模式,您的代码将更容易理解并且整体更清晰。所以只有在你有充分理由的情况下才使用它,比如你有一个方法返回一个值,但是也希望返回更多可能或可能不重要的值,调用者可以选择捕获它们。但是如果你只是简单地返回一个值并分配它,你可能会做得更好。