我需要使用一个方法,根据值返回多个字符串,不同的字符串。 我的代码如下:
- (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];
我无法上班!我得到的只是空字符串。我有一种感觉,对字符串的调用有些错误。请帮忙。
答案 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;
}
}
解决方案: