面试题答案
一键面试设计思路
- 确定方法签名:定义一个Objective - C方法,其参数使用
...
表示可变参数。 - 参数处理:利用
va_list
来遍历可变参数列表。在处理不同图形对象时,需要事先约定参数的顺序和类型,以便正确提取参数。 - 多线程安全性:在多线程环境下,每个线程应该有自己独立的
va_list
变量,避免线程间竞争。可以通过将va_list
封装在一个线程安全的对象内,或者在每个线程使用局部va_list
变量来保证安全性。
使用va_list处理参数
- 包含头文件:在文件开头包含
<stdarg.h>
,该头文件提供了va_list
相关的宏定义。 - 定义方法:例如,定义一个
drawShapes:
方法来处理图形绘制。
#import <Foundation/Foundation.h>
#import <stdarg.h>
@interface GraphicsRenderer : NSObject
- (void)drawShapes:(NSString *)shapeType, ...;
@end
@implementation GraphicsRenderer
- (void)drawShapes:(NSString *)shapeType, ... {
va_list args;
va_start(args, shapeType);
if ([shapeType isEqualToString:@"circle"]) {
float radius = va_arg(args, float);
NSLog(@"Drawing a circle with radius %f", radius);
} else if ([shapeType isEqualToString:@"rectangle"]) {
float width = va_arg(args, float);
float height = va_arg(args, float);
NSLog(@"Drawing a rectangle with width %f and height %f", width, height);
}
va_end(args);
}
@end
- 代码解释:
va_list args
:定义一个va_list
类型的变量args
,用于存储可变参数列表。va_start(args, shapeType)
:初始化va_list
,shapeType
是可变参数列表前的最后一个命名参数,该宏使args
指向可变参数列表的第一个参数。va_arg(args, type)
:从可变参数列表中取出一个类型为type
的参数,例如对于圆形取出float
类型的半径,对于矩形依次取出float
类型的宽和高。va_end(args)
:清理va_list
,释放相关资源,必须在使用完va_list
后调用。
多线程安全性保证
- 局部变量方式:在每个线程的方法内部定义
va_list
变量,这样每个线程都有自己独立的变量,避免竞争。
- (void)drawShapesInThread:(NSString *)shapeType, ... {
@autoreleasepool {
va_list args;
va_start(args, shapeType);
// 处理参数逻辑
va_end(args);
}
}
- 线程安全对象封装:可以将
va_list
相关操作封装在一个线程安全的类中,使用锁机制保证在多线程环境下的安全访问。
@interface ThreadSafeVaListHandler : NSObject
@property (nonatomic, strong) NSLock *lock;
- (void)handleVaListWithShapeType:(NSString *)shapeType, ...;
@end
@implementation ThreadSafeVaListHandler
- (instancetype)init {
self = [super init];
if (self) {
self.lock = [[NSLock alloc] init];
}
return self;
}
- (void)handleVaListWithShapeType:(NSString *)shapeType, ... {
[self.lock lock];
va_list args;
va_start(args, shapeType);
// 处理参数逻辑
va_end(args);
[self.lock unlock];
}
@end
在上述代码中,通过NSLock
来保护对va_list
的操作,在进入处理可变参数逻辑前加锁,处理完毕后解锁,确保多线程环境下的安全使用。