MST

星途 面试题库

面试题:Objective-C 类别(Category)中能否添加属性?若能,如何实现相关的存取操作?

在Objective-C中,类别(Category)通常不能直接添加实例变量。但我们知道可以通过关联对象(Associated Objects)来模拟添加属性。请简述如何在类别中添加一个NSString类型的属性`name`,并实现其存取方法。
45.4万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 添加属性声明: 在类别头文件中声明属性name
#import <Foundation/Foundation.h>

@interface NSObject (MyCategory)

@property (nonatomic, strong) NSString *name;

@end
  1. 实现存取方法: 在类别实现文件中,通过关联对象来实现存取方法:
#import "NSObject+MyCategory.h"
#import <objc/runtime.h>

static const char *kNameKey = "kNameKey";

@implementation NSObject (MyCategory)

- (void)setName:(NSString *)name {
    objc_setAssociatedObject(self, kNameKey, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSString *)name {
    return objc_getAssociatedObject(self, kNameKey);
}

@end

在上述代码中:

  • static const char *kNameKey = "kNameKey";定义了一个静态常量作为关联对象的键。
  • setName:方法使用objc_setAssociatedObject函数来设置关联对象,其中OBJC_ASSOCIATION_RETAIN_NONATOMIC表示使用非原子性的强引用。
  • name方法使用objc_getAssociatedObject函数来获取关联对象。