-1

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


- (void) returnStringsAccordingToSet:(NSString *)string1: (NSString *)string2: (NSInteger)setNo { 开关(setNo){ 情况1: 如果(一般字符串设置){ string1 = @"第一个字符串"; string2 = @"第二个字符串"; } 别的 { string1 = @"第一个其他字符串"; string2 = @"第二个其他字​​符串"; } 休息; 案例2: ... 休息; 案例3: ... 休息; } }

我用以下方法调用该方法:

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

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

4

3 回答 3

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";
于 2012-11-25T13:55:54.943 回答
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。
于 2012-11-25T14:13:35.013 回答
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];
于 2012-11-25T13:55:45.770 回答