美文网首页
runtime(二)--使用runtime给分类添加属性

runtime(二)--使用runtime给分类添加属性

作者: 小歪子go | 来源:发表于2017-12-17 17:08 被阅读0次

记得刚做开发的时候,给分类添加属性,使用的时候老是造成奔溃,后来才发现在分类中属性定义某个变量,则只会对该变量生成set,get方法的声明,不会生成实现,需要自己去写实现方法,也不会生成带下划线的成员变量。若要是想让外界访问该成员变量,1:可以在分类中用static定义全局变量,在get方法的实现中返回该成员变量 弊端:当该类销毁的时候,该属性的成员变量也不会销毁 2:在分类中利用runtime动态添加属性
*/

使用runtime给分类添加属性

#import <Foundation/Foundation.h>

@interface NSObject (Property)


/**
 * 1:@property分类:只会生成get,set方法声明,不会生成实现,需要自己手动去生成实现方法,也不会生成下划线成员属性,可以用static定义下划线的成员变量在手动实现的get方法中返回,也可以用runtime实现动态添加属性
   2:因为在分类中定义的属性不会生成下划线的成员变量,所以可以省略不写策略方式,只写定义就可以了@property NSString *name;
 */
@property NSString *name;

@end
#import "NSObject+Property.h"
#import <objc/message.h>
/**
 *    1:runtime动态添加属性: 1:为系统的类写分类,并属性定义变量,可以不写策略,并手动实现set和get方法
    2:在set方法中可以利用runtime实现动态添加属性
 objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    object:给哪个对象添加属性
    key:属性名称
    value:属性值
    policy:保存策略
 
    2:在set方法中可以将该值取出来:objc_getAssociatedObject(self, @"name");

 */
@implementation NSObject (Property)

//static NSString *_name;

- (void)setName:(NSString *)name
{
    // 让这个字符串与当前对象产生联系
    
//    _name = name;
    // object:给哪个对象添加属性
    // key:属性名称
    // value:属性值
    // policy:保存策略
    objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

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

@end
#import "ViewController.h"
#import "Person.h"
#import "NSObject+Property.h"




@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    NSObject *objc = [[NSObject alloc] init];
    objc.name = @"123";
    NSLog(@"%@",objc.name);
    
    // 创建字符串对象
//    NSString *str = [NSString stringWithString:@"123"];
//    
//    Person *p = [[Person alloc] init];
//    
//    p.name = str;
    
}

@end

相关文章

网友评论

      本文标题:runtime(二)--使用runtime给分类添加属性

      本文链接:https://www.haomeiwen.com/subject/yaxuwxtx.html