面试题答案
一键面试基本步骤
- 创建类的扩展(Category),在扩展的接口文件中声明属性。
- 在扩展的实现文件中,通过关联对象(Associated Objects)技术来为属性提供存储。
代码示例
假设有一个Person
类,以下是为其添加隐藏属性的过程:
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@end
Person+HiddenProperty.h
#import "Person.h"
@interface Person (HiddenProperty)
@property (nonatomic, copy) NSString *hiddenInfo;
@end
Person+HiddenProperty.m
#import "Person+HiddenProperty.h"
#import <objc/runtime.h>
static const char *kHiddenInfoKey = "kHiddenInfoKey";
@implementation Person (HiddenProperty)
- (void)setHiddenInfo:(NSString *)hiddenInfo {
objc_setAssociatedObject(self, kHiddenInfoKey, hiddenInfo, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)hiddenInfo {
return objc_getAssociatedObject(self, kHiddenInfoKey);
}
@end
- 使用示例
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Person+HiddenProperty.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] init];
person.name = @"John";
person.hiddenInfo = @"Some secret info";
NSLog(@"Name: %@, Hidden Info: %@", person.name, person.hiddenInfo);
}
return 0;
}