0

ここで何が間違っているのかわかりません。私はまた、以下を使用して設定s1..3を試みましfooた:

s1 = [[NSString alloc] initWithString:[filepaths objectAtIndex:0]];

以下のコンテキスト:

void foo(NSString *s1, NSString *s2, NSString *s3){
    //assign long string to NSString *fps
    //...
    //break fps into smaller bits
    NSArray *filepaths = [fps componentsSeparatedByString:@"\n"];
    //the above worked! now let's assign them to the pointers
    s1 = [filepaths objectAtIndex:0];
    //repeat for s2 and s3
    NSLog(@"%@",s1); //it worked! we're done in this function
}

int main(int argc, const char * argv[]){
    NSString *s1 = nil; //s2 and s3 as well
    foo(s1,s2,s3); //this should work
    NSLog(@"%@",s1); //UH OH, this is null!
    return 0;
}
4

2 に答える 2

1

いいえ。

ローカルで変更できるオブジェクトへのポインターを渡しています。単純な C から考えられるように、元のオブジェクトを変更していません

この方法を使用したい場合 (お勧めしません- の場合を除いて Cocoa で見られるのは本当に奇妙ですNSError)、次のようになります。

void foo(NSString **s1, NSString **s2, NSString **s3) {
    *s1 = [filepaths objectAtIndex:0]; // etc.
}

&s1次に、引数として渡します。

もちろん、これは にあったものを破壊しs1、本当に注意しない限り、メモリ リークやスレッドの安全性などを引き起こす可能性があります。これが、通常はこれを行わないと私が言う理由です。

于 2012-07-02T23:30:59.447 に答える
1

関数は引数のローカル コピーを取るためNSString*、元のコピーではなくコピーを変更しています。これを「値渡し」と呼びます。必要なのは、次のような「参照渡し」です。

void foo(NSString** s1) {
    if(s1) *s1 = @"Different string";
}

int main(int argc, const char* argv[]){
    NSString* s1 = nil;
    foo(&s1);
    NSLog(@"%@", s1);
    return EXIT_SUCCESS;
}

要するに、C のポインターをどれだけよく理解しているかにかかっています。 operator の「アドレス」&、逆参照 operator *、および一般的な C ポインターだけを読むことをお勧めします。

于 2012-07-02T23:32:05.847 に答える