Objective c 目标c重新分配点

Objective c 目标c重新分配点,objective-c,pointers,memory-address,Objective C,Pointers,Memory Address,不知什么原因,我不能把我的头绕在这上面 我有一个带有ivar(值)的类(模型)。我想将值传递给一个方法,并将值ivar更改为指向其他对象。这会将aValue更改为指向newString。那么,如何让model.value指向newString而不说model.value=newString (void)applicationDidFinishLaunching:(NSNotification *)aNotification { Model * model = [[Model alloc] in

不知什么原因,我不能把我的头绕在这上面

我有一个带有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);
}

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

您需要传入指向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
的值是
@“新字符串”

您正在接受指向该对象的指针,并使其指向另一个对象。通常情况下,函数会获得自己的指针,并且您为其指定一个新值在创建它的范围之外不会产生任何影响

实际上我不确定这是什么正式名称,但我很确定这就是它的工作原理。任何精通C语言的人都可能会澄清这一点


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

您需要传入一个指向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
的值是
@“新字符串”

您正在接受指向该对象的指针,并使其指向另一个对象。通常情况下,函数会获得自己的指针,并且您为其指定一个新值在创建它的范围之外不会产生任何影响

实际上我不确定这是什么正式名称,但我很确定这就是它的工作原理。任何精通C语言的人都可能会澄清这一点


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

使用
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];
}

使用
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];
}

我更新了要使用的方法(NSString**),并尝试了[self doSomething:&model.value];但是xcode给了我一元'&'操作数所需的左值
[self doSomething:&[model value]]
。它可能不喜欢属性的语法。我更新了要使用的方法(NSString**),并尝试了[self-doSomething:&model.value];但是xcode给了我一元'&'操作数所需的左值
[self doSomething:&[model value]]
。它可能不喜欢属性的语法。