004-runtime动态添加属性

1、使用场景

  • 使用runtime动态添加属性,目的就上让某个属性与对象产生关联
  • 需求:让NSObject类,保存一个‘字符串’

2、解决方法一

  • 给系统类定义一个分类(NSObject),并且定义一个属性。然后实现该属性的set方法和getter方法,通过定义一个全局变量来记录这个属性的值
//
//  NSObject+objcet.h
//  005-runtime(动态添加属性)
//
//  Created by 紫荆秋雪 on 2017/2/25.
//  Copyright © 2017年 Revan. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSObject (objcet)
//property:只负责声明 set方法、getter方法,当是并不会实现set方法和getter方法�
@property NSString *name;

@end

//
//  NSObject+objcet.m
//  005-runtime(动态添加属性)
//
//  Created by 紫荆秋雪 on 2017/2/25.
//  Copyright © 2017年 Revan. All rights reserved.
//

#import "NSObject+objcet.h"

//定义一个全局变量
static NSString *_name;

@implementation NSObject (objcet)

- (void)setName:(NSString *)name {
    _name = name;
}

- (NSString *)name {
    return _name;
}

@end

  • 调用方法
//
//  ViewController.m
//  005-runtime(动态添加属性)
//
//  Created by 紫荆秋雪 on 2017/2/25.
//  Copyright © 2017年 Revan. All rights reserved.
//

#import "ViewController.h"
#import "NSObject+objcet.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSObject *objc = [[NSObject alloc] init];
    objc.name = @"123";
    NSLog(@"%@", objc.name);
}


@end

  • 使用全局变量来记录属性值有一个缺点:有可能这个这个对象已经销毁了但是这个全局变量还存在

3、使用runtime来动态给对象添加属性

//
//  NSObject+objcet.h
//  005-runtime(动态添加属性)
//
//  Created by 紫荆秋雪 on 2017/2/25.
//  Copyright © 2017年 Revan. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSObject (objcet)
//property:只负责声明 set方法、getter方法,当是并不会实现set方法和getter方法�
@property NSString *name;

@end

//
//  NSObject+objcet.m
//  005-runtime(动态添加属性)
//
//  Created by 紫荆秋雪 on 2017/2/25.
//  Copyright © 2017年 Revan. All rights reserved.
//

#import "NSObject+objcet.h"
#import <objc/message.h>

@implementation NSObject (objcet)

- (void)setName:(NSString *)name {
    // object: 给那个对象添加属性
    // key: 属性名称
    // value: 属性值
    // policy: 保存策略
    objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

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

@end

  • 调用方法
//
//  ViewController.m
//  005-runtime(动态添加属性)
//
//  Created by 紫荆秋雪 on 2017/2/25.
//  Copyright © 2017年 Revan. All rights reserved.
//

#import "ViewController.h"
#import "NSObject+objcet.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSObject *objc = [[NSObject alloc] init];
    objc.name = @"123";
    NSLog(@"%@", objc.name);
}


@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容