美文网首页
oc的分类属性

oc的分类属性

作者: itclimb | 来源:发表于2017-07-04 16:24 被阅读81次
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方法,这样在类的外部就能用点语法获取并设置属性,这样可以认为给类添加了属性.
由于这是在查资料后自己的理解,因此可能会存在一定的错误,希望发现错误并指出,不断进行完善.

相关文章

  • Category关联对象

    OC中的分类严格来说,是不能添加对象;但是我们可以通过OC运行是的机制,动态为分类添加属性 一、类中的属性 当在类...

  • Swift— 便利构造器 (extension)

    * extension相当于OC中的分类, 特点和OC中的分类一样 * 不能定义存储属性 * 如果想给系统的类新增...

  • oc的分类属性

    Person.h Person.m 在控制器中获取并打印这个类的属性,成员变量以及方法,我们可以看到,对于类中的属...

  • iOS面试之OC模块

    OC oc内容如下:1.分类2.关联对象3.扩展4.代理5.通知6.KVO7.KVC8.属性关键字 1.分类 分类...

  • 分类-Category

    分类-Category 分类的功能 在OC中,我们可以使用分类为类添加方法,属性.也可以覆盖类原有的方法,自己添加...

  • 分类-Category

    分类-Category 分类的功能 在OC中,我们可以使用分类为类添加方法,属性.也可以覆盖类原有的方法,自己添加...

  • OC分类中增加属性

    原来看别人的文章介绍说分类中无法增加属性,但是看AFN,MJRefresh等开源库,发现很多都在分类中定义了属性,...

  • 通过runtime给分类添加属性

    OC中的分类只能添加方法,没有办法新增属性,但是有时候我们需要给分类新增属性,我们可以通过runtime实现。 R...

  • OC属性关联的实现原理

    OC中在分类中添加属性用属性关联技术来实现存取值的: 那么系统的属性关联功能是如何实现的呢? 属性关联怎么存储对象...

  • iOS 动分类添加手势(OC/Swift)

    OC版本 我们在OC经常会有需求给UIView添加手势的功能我们可以给分类添加属性是这么写的,即使用Runtime...

网友评论

      本文标题:oc的分类属性

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