29

初めまして、こんな素朴な質問で申し訳ありません。しかし、私は何が起こっているのかを理解する必要があります。

出力は になるはずだと思いましたupper case string。しかし、それはUPPER CASE STRING.

- (void)test
{
     NSString *stringVar = @"UPPER CASE STRING";
     [self changeString:stringVar];
     NSLog(@"value after changed : %@", stringVar);
}

- (void)changeString:(NSString*)string
{
     string = [string lowercaseString];
}

何が起こっていて、それを修正する方法は?

4

5 に答える 5

63

この[string lowercaseString]呼び出しにより、ローカル変数に割り当てる新しい オブジェクトが作成されます。これは、関数外の値を変更しません。ポインタ自体は値によって渡されます。NSStringstringstringVarchangeString

必要なことを行う1つの方法は、ポインターをポインターに渡すことです。

-(void) test
{
     NSString *stringVar = @"UPPER CASE STRING";
     [self changeString:&stringVar];
     NSLog(@"value after changed : %@", stringVar);
}

-(void) changeString:(NSString**)string
{
     *string = [*string lowercaseString];
}
于 2012-07-31T09:59:56.037 に答える
9

[NSString lowerCaseString] メソッドへの参照を見ると、小文字の文字を含む新しい文字列が返されることがわかります。

受信者の小文字表現を返します。

- (NSString *)lowercaseString

コードが行うことは、入力文字列への参照をlowercaseString呼び出しの出力で上書きするだけであり、効果はありません。この問題を解決する最善の方法は、自分で値を返すことです。これにより、メソッドが理解しやすくなります。

-(void) test
{
     NSString *stringVar = @"UPPER CASE STRING";
     stringVar = [self changeString:stringVar];
     NSLog(@"value after changed : %@", stringVar);
}

-(NSString *) changeString:(NSString*)string
{
     string = [string lowercaseString];
     return string;
}

これは不変であることを理解する必要NSStringがあるため、参照を再割り当てする以外に、文字列の内容を変更する方法はありません。ただし、NSMutableString代わりに使用することもできます。これは、その場で変更できます。

于 2012-07-31T10:02:46.683 に答える
1

上記の問題について言及し、間違いを解決するのを手伝っています。私のコメントを見つけてください

- (void)test
{
     NSString *stringVar = @"UPPER CASE STRING";
     //StringVar is a pointer to integer class.let us assume the address the stringVar be 0x50 and the value it has be 0x100
     //So 0x100 has the string 

     [self changeString:stringVar];
     //above we are calling the method to lowercase and argument is stringVar
     //As the method is called we pass 0x100 in the argument as this is the memory where the value is kept

     NSLog(@"value after changed : %@", stringVar);
    //Our StringVar still points to 0x100 where the value is in upperString
}

- (void)changeString:(NSString*)string
{
     string = [string lowercaseString];
    // Now operation performed on string returns a new value on suppose location 0x200
   //String parameter passed in argument is assigned the new value.But we never pass values as we pass only location under the hood
   //New parameter passed now points to new memory location 0x200

}

---------------------------------------------------------------------------------
With the new solution
-(void) test
{
     NSString *stringVar = @"UPPER CASE STRING";
     //let 0x50 be stringVar memorylocation pointing to 0x100 with above value
     [self changeString:&stringVar];
     //0x50 is passed in argument
     NSLog(@"value after changed : %@", stringVar);
     //On new location stored in address of stringVar it points to new string value
}

-(void) changeString:(NSString**)string
{
     *string = [*string lowercaseString];
     //0x200 is new memory location received.*string gives the 0x100 location and hence the value
   //LHS is assigned to new location .On LHS you find *string which will be assigned 0x200
   //As string with location 0x50 is value 0x200 which will make it to point new      location where lowercase string exist
}
于 2016-10-20T14:03:33.267 に答える
0

文字列in-(void) changeString:(NSString*)stringはローカル変数であり、戻り値にメソッドを変更します。

-(void) test
{
     NSString *stringVar = @"UPPER CASE STRING";
     stringVar =[self changeString:stringVar];
     NSLog(@"value after changed : %@", stringVar);
}
-(NSString *) changeString:(NSString*)string
{
    return [string lowercaseString];
}
于 2012-07-31T10:01:18.140 に答える
0

stringはローカル変数(不変のNSStringへのポインター)でありstring、ローカル関数でポイントするものを変更するだけですが、返すとその値は破棄されます。

文字列をパラメータとして渡し、関数から小文字の文字列を返すだけです。

于 2012-07-31T10:02:51.633 に答える