1

どういうわけかこれについて頭を包むことはできません...

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);
}

また、このくそったれなコード ブロックを正しく動作させるにはどうすればよいですか?

4

2 に答える 2

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];
}
于 2010-02-19T01:27:15.333 に答える
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に精通している人なら誰でも明確にすることができます。

もちろん、この例は値を返すだけで簡単にクリーンアップできます。このトリックは便利ですが、ほとんどの場合、このパターンを回避すると、コードが理解しやすくなり、全体的にすっきりすると思います。したがって、値を返すメソッドがあるなどの正当な理由がある場合にのみ使用しますが、重要であるかどうかに関係なく、呼び出し元がオプションでキャプチャできる値をさらに返したい場合にのみ使用してください。しかし、単純に値を返して代入できるのであれば、そのほうがよいでしょう。

于 2010-02-19T01:26:17.253 に答える