2012-01-25 4 views
3

Я пишу категорию против NSMutableString, которая использует appendFormat: внутренне.Objective-c метод с неизвестным количеством параметров

@interface NSMutableString (Additions)  
- (void)appendFormatWithLine:(NSString *)format, ...;  
@end 

@implementation NSMutableString (Additions) 

- (void)appendFormatWithLine:(NSString *)format, ... { 
    va_list args; 
    va_start(args, format); 

    // **calling [self appendFormat] gives a 'EXC_BAD_ACCESS'** 
    [self appendFormat:format, args]; 
    [self appendString:@"\r\n"]; 

    va_end(args); 
} 

@end 

Я понятия не имею, как использовать va_list или va_start позвонить NSMutableString:appendFormat. Как это может быть сделано?

+0

Это дает ответ на этот вопрос может быть полезным: HTTP: //stackoverflow.com/questions/2137752/objective-c-va-list-and-selectors –

ответ

5

Ну да. -appendFormat: принимает VARIADIC аргументов, а не VARIADIC списка аргументов Там нет ни одного метода на NSMutableString, которая принимает список аргументов, так что вы должны сделать это вместо того, чтобы (va_list.):

NSString *formatted = [[NSString alloc] initWithFormat: format arguments: args]; 
if (formatted) { 
    [self appendString: formatted]; 
    [formatted release]; 
} 
4

Вы не можете этого сделать. appendFormat: принимает переменные аргументы (сами аргументы), а не структуру va_list. В C невозможно передать вариативные аргументы.

Ваш метод, однако, можно переписать так:

- (void)appendFormatWithLine:(NSString *)format, ... 
{ 
    va_list args; 
    va_start(args, format); 

    // **calling [self appendFormat] gives a 'EXC_BAD_ACCESS'** 
    NSString *formatString = [[NSString alloc] initWithFormat:format arguments:args]; 
    [self sppendString:formatString]; 
    [formatString release]; 
    [self appendString:@"\r\n"]; 

    va_end(args); 
} 
Смежные вопросы