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中没有这一问题。