цель c переназначить точку - PullRequest
       12

цель c переназначить точку

1 голос
/ 19 февраля 2010

Я почему-то не могу обернуть голову вокруг этого ...

У меня есть класс (модель) с иваром (значением). Я хочу передать значение в метод и изменить значение 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);
}

Кроме того, как заставить этот чертов код работать правильно?

Ответы [ 2 ]

1 голос
/ 19 февраля 2010

Что не так с обновлением свойства с помощью 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];
}
0 голосов
/ 19 февраля 2010

Вам нужно передать указатель на ивар, а не сам ивар.

[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".

Вы принимаете указатель на объект и заставляете его указывать на другой объект. Обычно функция получает свой собственный указатель, и присвоение ему нового значения не имеет никакого эффекта за пределами области, в которой она была создана.

На самом деле я не уверен, как это официально называется, но я уверен, что так оно и есть. Любой, кто лучше разбирается в Си, может уточнить.

И, конечно, этот пример легко очищается простым возвратом значения. Этот трюк полезен, но я думаю, что в большинстве случаев ваш код будет проще для понимания и в целом чище, если вы будете избегать этого шаблона. Поэтому используйте его только в том случае, если у вас есть веская причина, например, если у вас есть метод, возвращающий значение, но вы также хотите возвращать больше значений, которые могут или не могут быть важными, что вызывающий может опционально захватить. Но если вы можете просто вернуть значение и присвоить его, вероятно, лучше сделать это.

...