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 中的指针的理解程度。阅读操作符的“地址” &、解引用操作符*以及一般的 C 指针是一个好主意。

于 2012-07-02T23:32:05.847 回答