面试题答案
一键面试1. 声明和定义匿名类别里的私有方法
- 在
.m
文件中声明匿名类别: 在Objective - C类的.m
文件中,使用@interface
关键字定义匿名类别(也叫类扩展)。匿名类别没有名称,定义如下:
#import "YourClass.h"
@interface YourClass ()
// 在这里声明私有方法
- (void)privateMethod;
@end
- 在
.m
文件中定义私有方法: 在@implementation
部分定义声明的私有方法:
@implementation YourClass
- (void)privateMethod {
// 私有方法的实现代码
NSLog(@"This is a private method.");
}
// 其他公有方法等实现
@end
2. 在主类的其他方法中调用私有方法
在主类的其他公有或私有方法中,直接像调用普通方法一样调用私有方法:
@implementation YourClass
- (void)publicMethod {
[self privateMethod];
}
- (void)privateMethod {
NSLog(@"This is a private method.");
}
@end
3. 多线程环境下可能存在的问题及解决方案
问题:
- 资源竞争:如果多个线程同时调用私有方法,且私有方法中涉及对共享资源的读写操作,可能会导致数据不一致。例如,一个线程正在修改共享变量,另一个线程同时读取该变量,就可能读到脏数据。
- 死锁:当私有方法中涉及多个锁的嵌套使用,且不同线程获取锁的顺序不一致时,可能会发生死锁。
解决方案:
- 使用锁机制:可以使用
NSLock
、NSRecursiveLock
或@synchronized
关键字来同步对共享资源的访问。例如,使用@synchronized
:
- (void)privateMethod {
@synchronized(self) {
// 对共享资源的操作
}
}
- 使用队列:使用
dispatch_queue_t
创建串行队列,将对共享资源的操作放入队列中执行,确保同一时间只有一个操作在执行。例如:
static dispatch_queue_t privateMethodQueue;
+ (void)load {
privateMethodQueue = dispatch_queue_create("com.example.privateMethodQueue", DISPATCH_QUEUE_SERIAL);
}
- (void)privateMethod {
dispatch_sync(privateMethodQueue, ^{
// 对共享资源的操作
});
}