Аргументы переменных в функции iPhone ObjC - PullRequest
5 голосов
/ 15 февраля 2010

Я, должно быть, застрял на сутулости сегодня, потому что потратил больше часа, пытаясь понять, как заставить работать переменные аргументы в этом проекте iPhone, над которым я работаю. Может ли кто-нибудь помочь мне получить зеленую полосу в приведенном ниже модульном тесте? Куда я иду не так?

#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 ]

6 голосов
/ 15 февраля 2010

Изменить это:

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

к этому:

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

Когда вы пишете метод с вариацией, у вас должно быть средство, чтобы определить, сколько аргументов нужно прочитать. Самый распространенный способ сделать это - найти завершающее значение в списке, который вы передаете. Вы не попали в состояние вашего терминала.

3 голосов
/ 16 февраля 2010

Кроме того, "two" - это const char *, а не id. Все виды забавных последствий могут возникнуть из-за отношения к нему как к ид. Заменить на @ "два".

Кроме того, если (eachArg) является посторонним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...