Вам нужно передать указатель на ивар, а не сам ивар.
[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"
.
Вы принимаете указатель на объект и заставляете его указывать на другой объект. Обычно функция получает свой собственный указатель, и присвоение ему нового значения не имеет никакого эффекта за пределами области, в которой она была создана.
На самом деле я не уверен, как это официально называется, но я уверен, что так оно и есть. Любой, кто лучше разбирается в Си, может уточнить.
И, конечно, этот пример легко очищается простым возвратом значения. Этот трюк полезен, но я думаю, что в большинстве случаев ваш код будет проще для понимания и в целом чище, если вы будете избегать этого шаблона. Поэтому используйте его только в том случае, если у вас есть веская причина, например, если у вас есть метод, возвращающий значение, но вы также хотите возвращать больше значений, которые могут или не могут быть важными, что вызывающий может опционально захватить. Но если вы можете просто вернуть значение и присвоить его, вероятно, лучше сделать это.