oc的分类属性

2017-07-04  本文已影响81人  itclimb
oc.jpg
我的博客
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方法,这样在类的外部就能用点语法获取并设置属性,这样可以认为给类添加了属性.
由于这是在查资料后自己的理解,因此可能会存在一定的错误,希望发现错误并指出,不断进行完善.

上一篇下一篇

猜你喜欢

热点阅读