我的博客
oc中在分类添加属性需要实现它的get和set方法,不然就会挂掉,查了一些资料,表达一下自己的理解.
首先,创建一个Person类:
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic, copy) NSString *name;
@property(nonatomic, assign) NSInteger age;
@end
Person.m
#import "Person.h"
@implementation Person
- (void)test{
NSLog(@"%s",__func__);
}
@end
在控制器中获取并打印这个类的属性,成员变量以及方法,我们可以看到,对于类中的属性,会程序会自动生成带"_"的成员变量和它的get,set方法,
类中的属性相当于成员变量以及set,get方法.
2017-07-04 15:50:39.581 分类属性分析[29919:4124560] 第0个属性:name
2017-07-04 15:50:39.582 分类属性分析[29919:4124560] 第1个属性:age
2017-07-04 15:50:39.582 分类属性分析[29919:4124560] 第0个成员变量:_name
2017-07-04 15:50:39.582 分类属性分析[29919:4124560] 第1个成员变量:_age
2017-07-04 15:50:39.583 分类属性分析[29919:4124560] 第0个方法:age
2017-07-04 15:50:39.583 分类属性分析[29919:4124560] 第1个方法:setAge:
2017-07-04 15:50:39.583 分类属性分析[29919:4124560] 第2个方法:test
2017-07-04 15:50:39.583 分类属性分析[29919:4124560] 第3个方法:.cxx_destruct
2017-07-04 15:50:39.583 分类属性分析[29919:4124560] 第4个方法:name
2017-07-04 15:50:39.584 分类属性分析[29919:4124560] 第5个方法:setName:
给Person类添加一个分类:
Person+Weight.h
#import "Person.h"
@interface Person (Weight)
@property(nonatomic, copy) NSString *weight;
@end
Person+Weight.m, 在.m中会有个警告,weight这个属性没有set,get方法.
#import "Person+Weight.h"
@implementation Person (Weight)
@end
再次在控制器中获取并打印这个类的属性,成员变量以及方法,在分类中添加的属性并没有生成带"_"的成员变量以及set,get方法.
2017-07-04 16:03:44.757 分类属性分析[30014:4213844] 第0个属性:weight
2017-07-04 16:03:44.757 分类属性分析[30014:4213844] 第1个属性:name
2017-07-04 16:03:44.758 分类属性分析[30014:4213844] 第2个属性:age
2017-07-04 16:03:44.758 分类属性分析[30014:4213844] 第0个成员变量:_name
2017-07-04 16:03:44.758 分类属性分析[30014:4213844] 第1个成员变量:_age
2017-07-04 16:03:44.758 分类属性分析[30014:4213844] 第0个方法:age
2017-07-04 16:03:44.758 分类属性分析[30014:4213844] 第1个方法:setAge:
2017-07-04 16:03:44.758 分类属性分析[30014:4213844] 第2个方法:test
2017-07-04 16:03:44.759 分类属性分析[30014:4213844] 第3个方法:.cxx_destruct
2017-07-04 16:03:44.759 分类属性分析[30014:4213844] 第4个方法:name
2017-07-04 16:03:44.759 分类属性分析[30014:4213844] 第5个方法:setName:
在Person+Weight.m中实现set,get方法,但是并不能用带"_"的成员变量直接进行赋值,从上面的打印可以看出没有成员变量,此时就需要根据oc语言的运行时机制,在程序运行时给分类的属性动态关联对象.
#import "Person+Weight.h"
#import <objc/runtime.h>
@implementation Person (Weight)
- (NSString *)weight{
return objc_getAssociatedObject(self, @"weight");
}
- (void)setWeight:(NSString *)weight{
objc_setAssociatedObject(self, @"weight", weight, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end
总结:在分类里使用@property声明属性,只是将该属性添加到该类的属性列表,并声明了setter和getter方法,但是没有生成相应的成员变量,也没有实现setter和getter方法。需要实现它的get和set方法,这样在类的外部就能用点语法获取并设置属性,这样可以认为给类添加了属性.
由于这是在查资料后自己的理解,因此可能会存在一定的错误,希望发现错误并指出,不断进行完善.
网友评论