Objective c 目标c重新分配点
不知什么原因,我不能把我的头绕在这上面 我有一个带有ivar(值)的类(模型)。我想将值传递给一个方法,并将值ivar更改为指向其他对象。这会将aValue更改为指向newString。那么,如何让model.value指向newString而不说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
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]]
。它可能不喜欢属性的语法。