获取Objective-C方法以返回多个NSStrings

时间:2012-11-25 13:52:05

标签: objective-c string pointers

我需要使用一个方法,根据值返回多个字符串,不同的字符串。 我的代码如下:


- (void) returnStringsAccordingToSet:(NSString *)string1: (NSString *)string2: (NSInteger)setNo { switch (setNo){ case 1: if (generalStringSettings){ string1 = @"The first string"; string2 = @"The second string"; } else { string1 = @"The first other string"; string2 = @"The second other string"; } break; case 2: ... break; case 3: ... break; } }

I call that method with:

NSString *firstString = [[NSString alloc]init]; NSString *secondString = [[NSString alloc]init]; NSUInteger set = 1; [self getStringsAccordingToSet: firstString: secondString: set];

我无法上班!我得到的只是空字符串。我有一种感觉,对字符串的调用有些错误。请帮忙。

3 个答案:

答案 0 :(得分:1)

你做不好,因为当你做

string1 = @"The first string";

您只需覆盖本地参数并更新其引用,但不会修改被调用者之外的任何内容。所以这个值只是在函数范围内改变了。

您应该将方法的签名更改为

- (NSArray*) returnStringsAccordingToSet:(NSString *)string1: (NSString *)string2: (NSInteger)setNo {

这样它返回一个NSArray而不是什么,然后在函数内

case1:
  return [NSArray arrayWithObjects:@"The first string",@"The second string",nil];

因此您返回数组并将其存储在调用者中,然后您可以访问返回的值。

NSArray *v = [returnStringAccordingTo: ..];
[v objectAtIndex:0]

从技术上讲,由于ObjectiveC是C的超集,我想可以通过引用将指针传递给指向NSString的指针(但是在ObjC中不鼓励这样做):

NSString *string = nil;
[self callMethod:&string];

-(void)callMethod:(NSString**)refToString {
  *refToString = @"foobar";

答案 1 :(得分:0)

更新说明:我个人不首先使用该方法。如果可能,我使用数组。不确定是否可以在ARC中使用它。一些Apple方法使用这种方法来返回错误值,因此最好注意它。

当调用方法时,传递给函数的那些参数被复制(当然它们没有获得复制消息,只要你传递指针就会复制指针),并且这些副本在函数内部使用(或者更具技术性)以参数值开始)。因此,如果您更改副本(即尝试替换指针上的对象,可变对象可以修改),这将不会反映该值。您可以使用指针解决此问题(即将指针传递给指针)。

所以:

NSString* string = @"one string";
NSLog(string); // one string

// [self method:string]
- (void) method: (NSString*) string {
    // Local copy created:
    // NSString* string = copy of string (second pointer created, object not copied in memory)
    string = @"other string";
    NSLog(string); // other string
}

NSLog(string); // one string

您可以这样做:

- (void) method: (NSString**)str {
    *str = @"Some string";
}

然后:

// string = "old vlalue"
NSString* string = @"old value";

// string = "Some string"
[self method:&string];

答案 2 :(得分:0)

你可以通过填写NSArray来做到这一点,但只是为了展示C的工作原理我将展示你所犯的错误。
string1和string2只是指针,因此您可以将可变或不可变的字符串作为参数传递。但原始指针永远不会被修改,例如:

NSString* string1=@"Hello";  // Let's suppose string1 is on the 0x8000 address
                             // And points to the 0x9000 address
NSString* string2=@"How are you?";  // string2: 0x1000 , pointing to 0x2000
[self returnStringsAccordingToSet: string1: string1 string2: string2];

然后,当您调用方法时,会为传递给方法的每个指针进行复制:

- (void) returnStringsAccordingToSet:(NSString *)string1: (NSString *)string2: (NSInteger)setNo {
// string1 and string2 both point on the same address, but they are other pointers
// for example string1 is on 0x7000 and string2 on 0x7400, pointing to 0x9000
// and 0x2000
    switch (setNo){
        case 1:
            if (generalStringSettings){
                string1 = @"The first string";  // You just create another instance
                string2 = @"The second string"; // of the string, but the original
                // pointers aren't affected
            } else {
                string1 = @"The first other string";
                string2 = @"The second other string";
            }
            break;
        case 2:
             ...
             break;
        case 3:
             ...
             break;
    }
}

解决方案:

  1. 传递一个NSMutableString作为参数,而不是分配它们,只需修改内容;
  2. 将指针传递给指针;
  3. 返回包含新字符串的NSArray。