记得刚做开发的时候,给分类添加属性,使用的时候老是造成奔溃,后来才发现在分类中属性定义某个变量,则只会对该变量生成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
网友评论