美文网首页
iOS开发:分类添加属性,不会添加实例变量

iOS开发:分类添加属性,不会添加实例变量

作者: Flynn_Lee | 来源:发表于2021-09-19 18:05 被阅读0次

1、不能在分类中添加实例变量的原因

struct _category_t {
    const char *name;
    struct _class_t *cls;
    const struct _method_list_t *instance_methods;  // 对象方法列表
    const struct _method_list_t *class_methods;  // 类方法列表
    const struct _protocol_list_t *protocols;  // 协议列表
    const struct _prop_list_t *properties;  // 属性列表
};

因为分类的本质也是结构体,这里没有实例变量的列表,添加进去存不了。(个人理解)

2、实际操作检查的结果

1)创建分类的.h和.m文件

.h文件

#import "timerController.h"

NS_ASSUME_NONNULL_BEGIN

@interface timerController (timer)
@property(nonatomic,copy)NSString *time;
@end

.m文件(使用关联对象实现setter和getter方法)

-(NSString *)time
{
    return objc_getAssociatedObject(self, _cmd);
    
}

-(void)setTime:(NSString *)time
{
    objc_setAssociatedObject(self, @selector(time), time, OBJC_ASSOCIATION_COPY);
}

2)打印类的实例变量列表


- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.time = @"this is test";
    
    NSLog(@"----%@",self.time);
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSLog(@"---touchesBegan---");

    unsigned int count;
    
    Ivar *ivars = class_copyIvarList([self class], &count);
    
    for (int i = 0; i < count; i++) {
        
        Ivar iva = ivars[i];
        
        NSString *nameSTR = [NSString stringWithCString:ivar_getName(iva) encoding:NSUTF8StringEncoding];
        
        NSLog(@"---->>>%@",nameSTR);
        
    }
}

3)打印结果

2021-09-19 18:02:24.195602+0800 test2021913[54696:5234312] ----this is test
2021-09-19 18:02:26.109386+0800 test2021913[54696:5234312] ---touchesBegan---
2021-09-19 18:02:27.058011+0800 test2021913[54696:5234312] ---touchesBegan---
2021-09-19 18:02:27.386368+0800 test2021913[54696:5234312] ---touchesBegan---
2021-09-19 18:02:27.796677+0800 test2021913[54696:5234312] ---touchesBegan---

从打印结果可以看出,time属性添加成功,getter和setter方法也实现了,touchesBegan方法点击也有响应,但是类的实例变量列表里没有_time。

相关文章

  • iOS开发:分类添加属性,不会添加实例变量

    1、不能在分类中添加实例变量的原因 因为分类的本质也是结构体,这里没有实例变量的列表,添加进去存不了。(个人理解)...

  • category的属性

    在分类中添加的属性,不会自动生成实例变量,分类添加的属性其实是添加该属性的getter与setter方法。用@pr...

  • 2020-04-05 KVC

    课程引入:成员变量、实例变量、属性,区别是什么?---分类不能添加实例变量 成员变量 -- 实例变量 -- 属性 ...

  • category底层原理

    category原码 通过查看源码可以看出,给分类可以添加实例方法,类方法,协议,属性(无法添加实例变量)。 添加...

  • ios分类添加属性

    为什么分类不能添加属性 结构体没有属性列表:这也就是为什么分类不能添加属性的本质原因。 属性是什么 生成实例变量 ...

  • iOS 关联对象 Category间接添加成员变量

    iOS添加关联对象即可为分类间接添加成员变量 在分类中声明属性,只相当于声明了两个方法(set和get),不会生成...

  • OC语法 Category底层结构

    用途 为已有类添加额外的实例方法、类方法,属性,协议,或通过runtime 关联对象 间接添加成员变量。分类内添加...

  • 分类随笔

    分类常见面试题 1、分类可以添加属性吗? 答:分类可以添加属性,但是不会自动生成成员变量与get/set方法。但是...

  • Objective-C Associated Objects 的

    当我们写个分类的时候,有时候想给这个分类添加属性,但是却不能添加实例变量,然而我们可以通过 Associated ...

  • 使用runtime给分类(category)添加属性及成员变量

    iOS分类: 很多说法是只能添加方法,而不能添加成员变量或属性。这种说法是不严谨的,并不是绝对不能添加变量。 解释...

网友评论

      本文标题:iOS开发:分类添加属性,不会添加实例变量

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