-1

値に応じて、異なる文字列を返すメソッドを使用する必要があります。私のコードは次のようになります:


-(void)returnStringsAccordingToSet:(NSString *)string1:(NSString *)string2:(NSInteger)setNo { スイッチ(setNo){ ケース1: if(generalStringSettings){ string1 =@"最初の文字列"; string2 =@"2番目の文字列"; } そうしないと { string1 =@"最初の他の文字列"; string2 =@"他の2番目の文字列"; } 壊す; ケース2: ..。 壊す; ケース3: ..。 壊す; } }

私はそのメソッドを次のように呼び出します。

NSString *firstString = [[NSString alloc]init]; NSString *secondString = [[NSString alloc]init]; NSUInteger set = 1; [self getStringsAccordingToSet: firstString: secondString: set];

動かない!私が得るのは空の文字列だけです。文字列の呼び出しが少し間違っているような気がします。助けてください。

4

3 に答える 3

1

あなたがそうするとき、あなたはそれがうまくいくようにすることはできません

string1 = @"The first string";

ローカルパラメータを上書きしてその参照を更新するだけですが、呼び出し先の外部には何も変更されません。したがって、値は関数のスコープ内で変更されます。

メソッドのシグネチャを次のように変更する必要があります

- (NSArray*) returnStringsAccordingToSet:(NSString *)string1: (NSString *)string2: (NSInteger)setNo {

その代わりにNSArrayを返し、関数内に何も返さないようにします

case1:
  return [NSArray arrayWithObjects:@"The first string",@"The second string",nil];

したがって、配列を返し、呼び出し元からそれを格納すると、返された値にアクセスできます。

NSArray *v = [returnStringAccordingTo: ..];
[v objectAtIndex:0]

NSString技術的には、ObjectiveCはCのスーパーセットであるため、参照によってポインターへのポインターを渡すことは可能だと思います(ただし、これはObjCでは推奨されていません)。

NSString *string = nil;
[self callMethod:&string];

-(void)callMethod:(NSString**)refToString {
  *refToString = @"foobar";
于 2012-11-25T13:55:54.943 に答える
0

更新メモ:私は個人的にこのメソッドを最初に使用することはありません。可能であれば、配列を使用します。これをARCで使用しても問題ないかどうかはわかりません。一部のAppleメソッドは、このアプローチを使用してエラー値を返すため、注意しておくとよいでしょう。

メソッドが呼び出されると、関数に渡す引数がコピーされ(もちろん、コピーメッセージは取得されず、ポインターを渡す限りポインターがコピーされます)、これらのコピーは関数内で使用されます(または、より技術的には、引数値)。したがって、コピーを変更した場合(つまり、ポインター上のオブジェクトを置き換えようとした場合、変更可能なオブジェクトは変更しても問題ありません)、これは値に反映されません。これは、ポインターを使用して解決できます(つまり、ポインターをポインターに渡します)。

それで:

NSString* string = @"one string";
NSLog(string); // one string

// [self method:string]
- (void) method: (NSString*) string {
    // Local copy created:
    // NSString* string = copy of string (second pointer created, object not copied in memory)
    string = @"other string";
    NSLog(string); // other string
}

NSLog(string); // one string

あなたはそのようにこれをするかもしれません:

- (void) method: (NSString**)str {
    *str = @"Some string";
}

その後:

// string = "old vlalue"
NSString* string = @"old value";

// string = "Some string"
[self method:&string];
于 2012-11-25T13:55:45.770 に答える
0

NSArrayに入力することでこれを行うことができますが、Cがどのように機能するかを示すために、発生したエラーを示します。
string1とstring2は単なるポインターであるため、引数として可変または不変の文字列を渡すことができますが、元のポインターが変更されることはありません。たとえば、次のようになります。

NSString* string1=@"Hello";  // Let's suppose string1 is on the 0x8000 address
                             // And points to the 0x9000 address
NSString* string2=@"How are you?";  // string2: 0x1000 , pointing to 0x2000
[self returnStringsAccordingToSet: string1: string1 string2: string2];

次に、メソッドを呼び出すと、メソッドに渡すすべてのポインターに対してコピーが作成されます。

- (void) returnStringsAccordingToSet:(NSString *)string1: (NSString *)string2: (NSInteger)setNo {
// string1 and string2 both point on the same address, but they are other pointers
// for example string1 is on 0x7000 and string2 on 0x7400, pointing to 0x9000
// and 0x2000
    switch (setNo){
        case 1:
            if (generalStringSettings){
                string1 = @"The first string";  // You just create another instance
                string2 = @"The second string"; // of the string, but the original
                // pointers aren't affected
            } else {
                string1 = @"The first other string";
                string2 = @"The second other string";
            }
            break;
        case 2:
             ...
             break;
        case 3:
             ...
             break;
    }
}

解決策:

  1. NSMutableStringを引数として渡し、それらを割り当てる代わりに、内容を変更するだけです。
  2. ポインタをポインタに渡します。
  3. 新しい文字列を含むNSArrayを返します。
于 2012-11-25T14:13:35.013 に答える