gpt4 book ai didi

objective-c - 包装 [NSString stringWithFormat :]? 的正确方法是什么

转载 作者:太空狗 更新时间:2023-10-30 03:34:43 25 4
gpt4 key购买 nike

假设我有一个带有签名的方法:

+ (NSString *) myFormattedString:(NSString *)format, ...;

我希望它在前面加上我选择的字符串(例如@"Foo:")。我想最好的方法是使用 [myString initWithFormat:arguments:],但您将如何实现此方法?


<罢工>我尝试执行以下操作,但收到评论中指定的警告:

+ (NSString *) myFormattedString:(NSString *)format, ... {
char *buffer;
[format getCString:buffer maxLength:[format length] encoding:NSASCIIStringEncoding];

va_list args;
va_start(args, buffer); // WARNING: second parameter of 'va_start' not last named argument

NSString *str = [[NSString alloc] initWithFormat:format arguments:args];
[str autorelease];

return [NSString stringWithFormat:@"Foo: %@.", str];
}

我假设 va_start() 可以接受 (char *) 的原因是因为我在 manual page of STDARG(3) 上看到的示例.如果我做的完全错了,请随意完全重写该方法。

最佳答案

我想你想要的是这样的:

+ (NSString *) myFormattedString:(NSString *)format, ... {
va_list args;
va_start(args, format);
NSString *str = [[[NSString alloc] initWithFormat:format arguments:args] autorelease];
va_end(args);
return [NSString stringWithFormat:@"Foo: %@.", str];
}

stdarg.h va_* 宏用于函数(或本例中的方法)采用可变数量的参数,如“...”。 va_start() 用于查找可变数量参数的起始位置。因此,它需要知道函数/方法的最后一个参数(就在“...”之前的参数)以确定可变数量的参数从哪里开始。这是一个稍微简化的解释,因为幕后实际发生的事情是非常特定于 ABI/编译器的。最重要的一点是 va_start() 的第二个参数始终是“...”之前的变量名称。

va_end() 应该被“调用”(它实际上是一个宏,而不是一个函数)以获得最大的可移植性。再一次,这整个可变参数的事情是深奥的,深奥的黑魔法。根据编译器和 ABI 的具体情况,va_end() 可能根本不执行任何操作。另一方面,未能使用 va_end() 可能会导致程序在到达 return 语句时崩溃,因为堆栈帧(如果有的话)没有更长的正确设置以实际执行返回。

关于objective-c - 包装 [NSString stringWithFormat :]? 的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1209361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com