Cocoa NSString指针已传递到函数。。。没有保留我设置的值

Cocoa NSString指针已传递到函数。。。没有保留我设置的值,cocoa,pointers,parameter-passing,Cocoa,Pointers,Parameter Passing,我不确定我做错了什么。我还尝试在foo中设置s1..3,方法是: s1=[[NSString alloc]initWithString:[filepath objectAtIndex:0]] 背景如下: void foo(NSString *s1, NSString *s2, NSString *s3){ //assign long string to NSString *fps //... //break fps into smaller bits NSArra

我不确定我做错了什么。我还尝试在
foo
中设置
s1..3
,方法是:

s1=[[NSString alloc]initWithString:[filepath 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;
}
没有

您正在传递指向对象的指针,这些对象可以在本地发生变化。您正在而不是更改原始对象,就像您在普通C中所想的那样

如果您想使用此方法(我不推荐使用此方法-在Cocoa中看到此方法真的很奇怪,除了
NSError
),您可以使用以下方法:

void foo(NSString **s1, NSString **s2, NSString **s3) {
    *s1 = [filepaths objectAtIndex:0]; // etc.
}
然后将
&s1
作为参数传入


当然,这将破坏
s1
中的任何内容,可能导致内存泄漏、线程不安全等,除非您非常小心。这就是为什么我说您通常不会这样做。

函数获取其参数的本地副本,因此您修改的是
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;
}

<> P>这归结为你理解C中的指针有多好,读一读“操作符<地址>和代码>、解引用操作符<代码> */COD>和C指针一般是个好主意。

这是一个短的、相对简单的命令行程序,但是基础和脚本桥框架是有用的,这是在Obj-C中。同样,这要归咎于几年过去了,自从上次我需要或想传递指针以来。@ray用Objective-C编写命令行程序没有什么错;事实上,今天早上我在邮件列表上向某人推荐了这个。我建议您改变想法:让该方法返回一个包含字符串的NSArray。更简单、更清晰,不太可能在其他地方引起问题。@ray我不是100%确定,但我认为C中引用返回的约定在很大程度上是由于C中几乎完全没有集合原语(甚至数组只是美化的指针),而Objective-C中没有这一问题。