iPhone ObjC功能中的变量args

时间:2010-02-15 20:45:46

标签: iphone objective-c

我今天必须坚持使用stoopid,因为我花了一个多小时试图了解如何在我正在研究的这个iPhone项目中使变量args工作。有人可以帮助我在下面的单元测试中获得绿色条形图吗?我哪里错了?

#import <SenTestingKit/SenTestingKit.h>

@interface VAArgsTest : SenTestCase
{

}

@end

NSString* vaArgsAppend(NSString *first, ...)
{
  NSMutableString *list = [[NSMutableString alloc] initWithString:first];
  id eachArg;
  va_list argumentList;
  va_start(argumentList, first);
  while(eachArg = va_arg(argumentList, id)) {
    if(eachArg)[list appendString:(NSString*)eachArg];
  }
  va_end(argumentList);
  return [list autorelease];
}

@implementation VAArgsTest

-(void) testCallVaArgsAppend
{
  NSString *result = vaArgsAppend(@"one ", "two ", @"three");
  STAssertEqualObjects(result, @"one two three", @"Expected appended string.");
}

@end

2 个答案:

答案 0 :(得分:6)

改变这个:

NSString *result = vaArgsAppend(@"one ", "two ", @"three");

到此:

NSString *result = vaArgsAppend(@"one ", @"two ", @"three", nil);

编写可变方法时,必须有一种方法来确定要读取的参数数量。最常见的方法是在传入的列表中查找终止值。您没有达到终端条件。

答案 1 :(得分:3)

另外,“two”是一个const char *,而不是id。各种有趣的后果可能会因为像id一样对待它。替换为@“two”。

另外,如果(eachArg)是无关的。