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
网友评论