MST

星途 面试题库

面试题:Objective-C中如何通过匿名类别实现私有方法声明并正确使用

假设你有一个Objective-C类,你想通过匿名类别来声明私有方法。请描述实现步骤,包括如何在类的.m文件中声明和定义匿名类别里的私有方法,以及在主类的其他方法中如何正确调用这些私有方法。同时说明这种方式在多线程环境下可能存在的问题及解决方案。
40.3万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

1. 声明和定义匿名类别里的私有方法

  1. .m 文件中声明匿名类别: 在Objective - C类的 .m 文件中,使用 @interface 关键字定义匿名类别(也叫类扩展)。匿名类别没有名称,定义如下:
#import "YourClass.h"

@interface YourClass ()
// 在这里声明私有方法
- (void)privateMethod;
@end
  1. .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. 多线程环境下可能存在的问题及解决方案

问题

  • 资源竞争:如果多个线程同时调用私有方法,且私有方法中涉及对共享资源的读写操作,可能会导致数据不一致。例如,一个线程正在修改共享变量,另一个线程同时读取该变量,就可能读到脏数据。
  • 死锁:当私有方法中涉及多个锁的嵌套使用,且不同线程获取锁的顺序不一致时,可能会发生死锁。

解决方案

  • 使用锁机制:可以使用 NSLockNSRecursiveLock@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, ^{
        // 对共享资源的操作
    });
}