MST

星途 面试题库

面试题:Objective-C可变参数方法的复杂应用与va_list优化

定义一个Objective-C可变参数方法,该方法能接受不同类型(至少包括整数、浮点数和字符串)的参数,根据传入参数类型进行不同的操作(例如整数求平均值,浮点数求平方和,字符串连接),并且要求你优化va_list的使用,避免内存泄漏和提高代码效率,写出完整代码及必要注释。
17.9万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
#import <Foundation/Foundation.h>

// 定义一个函数,根据不同参数类型进行不同操作
void performOperationsWithArguments(NSInteger count, ...) {
    va_list args;
    va_start(args, count); // 初始化可变参数列表
    
    NSInteger intSum = 0;
    NSInteger intCount = 0;
    double floatSum = 0;
    NSMutableString *stringResult = [NSMutableString string];
    
    for (NSInteger i = 0; i < count; i++) {
        const char *type = va_arg(args, const char *); // 获取参数类型
        if (strcmp(type, @encode(int)) == 0) {
            int number = va_arg(args, int);
            intSum += number;
            intCount++;
        } else if (strcmp(type, @encode(double)) == 0) {
            double number = va_arg(args, double);
            floatSum += number * number;
        } else if (strcmp(type, @encode(NSString *)) == 0) {
            NSString *str = va_arg(args, NSString *);
            [stringResult appendString:str];
        }
    }
    
    va_end(args); // 清理可变参数列表
    
    if (intCount > 0) {
        NSLog(@"整数平均值: %f", (double)intSum / intCount);
    }
    NSLog(@"浮点数平方和: %f", floatSum);
    NSLog(@"字符串连接结果: %@", stringResult);
}

你可以这样调用这个函数:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        performOperationsWithArguments(4,
                                       @encode(int), 1,
                                       @encode(double), 2.5,
                                       @encode(NSString *), @"Hello",
                                       @encode(int), 3);
    }
    return 0;
}

代码说明:

  1. performOperationsWithArguments函数
    • 接受一个NSInteger类型的count参数,表示传入参数的个数。
    • 使用va_listva_startva_argva_end来处理可变参数。
    • 遍历每个参数,根据参数类型进行不同操作:
      • 对于整数,累加并统计个数,最后计算平均值。
      • 对于浮点数,计算平方和。
      • 对于字符串,进行连接。
  2. main函数
    • 调用performOperationsWithArguments函数,传入不同类型的参数,并给出参数类型编码。
  3. 注意事项
    • 每次调用va_arg时,确保传入正确的类型,否则可能导致未定义行为。
    • 使用完可变参数列表后,务必调用va_end,以避免内存泄漏。这优化了va_list的使用,确保内存正确管理并且提高了代码效率。