MST

星途 面试题库

面试题:Objective-C中基于runtime实现UI组件动态自定义与复用的优化

在Objective-C项目中,已知UI组件的自定义和复用需求经常变动,要求利用runtime机制实现动态的UI组件自定义和复用,以减少代码冗余并提高可维护性。请详细描述实现思路,包括如何通过runtime动态添加属性、方法,以及如何优化组件复用过程中的内存管理,给出完整且可运行的代码示例。
21.7万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 动态添加属性:通过objc_setAssociatedObjectobjc_getAssociatedObject函数来实现关联对象,从而为对象动态添加属性。
  2. 动态添加方法:使用class_addMethod函数在运行时动态为类添加方法,实现动态行为。
  3. 优化内存管理:在复用组件时,确保关联对象正确释放。可以通过在对象的dealloc方法中移除关联对象来避免内存泄漏。

代码示例

#import <UIKit/UIKit.h>
#import <objc/runtime.h>

// 定义关联对象的key
static const char *kCustomPropertyKey = "kCustomPropertyKey";

@interface CustomView : UIView

@end

@implementation CustomView

// 动态添加属性的setter方法
- (void)setCustomProperty:(NSString *)customProperty {
    objc_setAssociatedObject(self, kCustomPropertyKey, customProperty, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

// 动态添加属性的getter方法
- (NSString *)customProperty {
    return objc_getAssociatedObject(self, kCustomPropertyKey);
}

// 动态添加方法
void dynamicMethodIMP(id self, SEL _cmd) {
    NSLog(@"Dynamic method called on %@", self);
}

+ (void)load {
    // 动态添加方法
    class_addMethod(self, @selector(dynamicMethod), (IMP)dynamicMethodIMP, "v@:");
}

- (void)dealloc {
    // 移除关联对象,优化内存管理
    objc_setAssociatedObject(self, kCustomPropertyKey, nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

@interface ViewController : UIViewController

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    CustomView *customView = [[CustomView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
    customView.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview:customView];
    
    // 设置动态属性
    customView.customProperty = @"Custom Value";
    NSLog(@"Custom property: %@", customView.customProperty);
    
    // 调用动态方法
    if ([customView respondsToSelector:@selector(dynamicMethod)]) {
        [customView performSelector:@selector(dynamicMethod)];
    }
}

@end

在上述代码中:

  1. CustomView类通过关联对象动态添加了customProperty属性。
  2. +load方法中使用class_addMethod动态添加了dynamicMethod方法。
  3. dealloc方法中移除了关联对象,优化了内存管理。
  4. ViewController中创建了CustomView实例,并演示了动态属性的设置与获取,以及动态方法的调用。