OC的分类

教程 | 基于遥感生态指数(RSEI)模型的生态环境质量评价 使用数据:Landsat8 OLI数据,行列号:122036,时间:20210527。 使用软件:ENVI5.3、ArcGIS10.2 二、4个指数计算 下述的四个指数的计算均是通过ENVI软件中的Band math工具进行计算。 (1)绿度指数 在常用的植被指数当中,归一化植被指数 ( NDVI) 能够有效地反映植被的生长情况与植被 覆盖度等重要植被的物理性质,检测灵敏度高,能 够较为真实地展现区域的地表空间变化规律,已经得到广泛利用,本文采用 NDVI 指数来代表绿度指数。 在ENV 阅读详情

OC的分类

1 OC 分类作用

  • 生命私有的方法
  • 分解体积庞大的类文件
  • 把Framework的私有方法公开

2 分类的特点

  • 运行时决议
  • 可以为系统添加分类

3 分类可以添加哪些内容

  • 实例方法

  • 类方法

  • 协议

  • 属性

分类会被编译成一个结构体

struct category_t {
    
    const char *name;                           分类名称
    classref_t cls;                             该分类所属的宿主类
    struct method_list_t *instanceMethods;      实例方法列表
    struct method_list_t *classMethods;         类方法列表
    struct protocol_list_t *protocols;          协议列表
    struct property_list_t *instanceProperties; 实例属性列表
    
}

4 分类的加载调用栈

去苹果的网站下载runtime 的源码 去一下,找打objc文件夹,下载一个源码,找到runtime文件夹下面的objc-runtime-new 文件打开就是的

✈️✈️✈️

宿主类的方法列表是一个二维数组

假设分类有三个分类,每一个分类有三个方法,存放顺序就是这样的顺序。

也就解释了问什么分类方法覆盖的问题,方法调用的时候一旦查到第一个方法名就会返回,位置靠前的同名方法方法有优先执行的权利。

[[method_1,method_2,method_3],[method_1,method_2,method_3],[method_1,method_2,method_3]]

此句话 才是分类方法真正的添加到宿主类上面

rw->methods.attachLists(mlists, mcount);

static void remethodizeClass(Class cls)
{
    category_list *cats;
	
    bool isMeta;

    runtimeLock.assertLocked();
	// 假设为NO
    isMeta = cls->isMetaClass();

    // Re-methodizing: check for more categories
    // cats 是未拼接分类的列表
    // unattachedCategoriesForClass 在对应的类中获取是否有未拼接的分类方法 如果有的话 进行拼接整合操作
	// attachCategories 将所有的分类拼接到所属的宿主类上面
    if ((cats = unattachedCategoriesForClass(cls, false/*not realizing*/))) {
        if (PrintConnecting) {
            _objc_inform("CLASS: attaching categories to class '%s' %s", 
                         cls->nameForLogging(), isMeta ? "(meta)" : "");
        }
        
        attachCategories(cls, cats, true /*flush caches*/);        
        free(cats);
    }
}




attachCategories(Class cls, category_list *cats, bool flush_caches)
{
    if (!cats) return;
	
	
	
    if (PrintReplacedMethods) printReplacements(cls, cats);
	
	// 判断是实例方法 或者 类方法
    bool isMeta = cls->isMetaClass();

    // fixme rearrange to remove these intermediate allocations
	
    // 方法列表
    method_list_t **mlists = (method_list_t **)
        malloc(cats->count * sizeof(*mlists));
        // 属性列表
    property_list_t **proplists = (property_list_t **)
        malloc(cats->count * sizeof(*proplists));
        // 协议列表
    protocol_list_t **protolists = (protocol_list_t **)
        malloc(cats->count * sizeof(*protolists));

    // Count backwards through cats to get newest categories first
    int mcount = 0;
    int propcount = 0;
    int protocount = 0;
    // 宿主类分类的总数
    int i = cats->count;
    bool fromBundle = NO;
    while (i--) {
    // 倒叙的遍历 先访问最后编译的分类
    // 如果是两个分类有同名的方法,最后编译的分类的方法会最终生效
		
    	// 获取一个分类
        auto& entry = cats->list[i];

		// 获取该分类的方法列表
        method_list_t *mlist = entry.cat->methodsForMeta(isMeta);
        if (mlist) {
        	// 最后编译的分类最先添加到分类数组中
            mlists[mcount++] = mlist;
            fromBundle |= entry.hi->isBundle();
        }

        property_list_t *proplist = 
            entry.cat->propertiesForMeta(isMeta, entry.hi);
        if (proplist) {
            proplists[propcount++] = proplist;
        }

        protocol_list_t *protolist = entry.cat->protocols;
        if (protolist) {
            protolists[protocount++] = protolist;
        }
    }

    auto rw = cls->data();

    prepareMethodLists(cls, mlists, mcount, NO, fromBundle);
    
    // 将分类的方法 mlists 数组拼接到宿主的方法列表上面去
    rw->methods.attachLists(mlists, mcount);
    free(mlists);
    if (flush_caches  &&  mcount > 0) flushCaches(cls);

    rw->properties.attachLists(proplists, propcount);
    free(proplists);

    rw->protocols.attachLists(protolists, protocount);
    free(protolists);
}

GD32F103程序烧录全攻略:从SWD到串口的实战指南 本文提供了GD32F103微控制器程序烧录的全面实战指南,详细介绍了SWD、JTAG和串口(ISP)三种主流下载方式。文章重点解析了在Keil MDK中使用ST-Link进行SWD下载的完整步骤,包括硬件连接、软件配置和Flash算法设置,并针对烧录过程中的常见问题提供了实用的排坑解决方案,帮助开发者高效完成程序部署。 阅读详情

相关推荐

Benchmark系列——UnixBench测试项深度解析与性能优化指南

本文深度解析UnixBench基准测试套件的各项测试原理,包括Dhrystone、Whetstone、系统调用、进程管理、IPC及文件I/O等核心测试项。通过详细的测试项分析,指导用户解读测试报告,并提供针对性的内核参数调整、编译优化及系统配置实战指南,帮助用户精准定位并优化系统性能瓶颈。

weixin_29230901的博客 275

OC的分类和类拓展

一、分类(Category): 分类(Category)是OC中的特有语法,它是表示一个指向分类的结构体的指针。原则上它只能增加方法,不能增加成员(实例)变量。具体原因看源码组成: Category Category 是表示一个指向分类的结构体的指针,其定义如下:typedef struct objc_category *Category;struct objc_category { char *category_name OBJC2_UNAVAILABLE; // 分类名 ch

ancientear的博客 2030

深入剖析一个卷积块(ConvBlock)

深入剖析一个卷积块(ConvBlock)

qq_45670407的博客 1920

OC 中的分类(Category)详解

1、Category 分类、类别 2、分类:可以给某一个类扩充一些方法(不修改原来类的代码) 3、分类也分为声明(放在.h文件)和实现(放在.m文件): 分类的声明格式如下 @interface 类名(分类名称) //要给类扩充的方法的声明 @end 分类的实现 @implementation 类名(分类名称) //对应的方法实现 @end 4、分类名一般以模块进行命名...

iteye_18817的博客 1206

STM32C8T6HAL库实战:MAX30102心率血氧检测与OLED多级菜单一体化方案

本文详细介绍了基于STM32C8T6和HAL库的MAX30102心率血氧检测与OLED多级菜单一体化方案。内容涵盖硬件连接、CubeMX工程配置、传感器驱动移植、数据滤波算法、OLED显示驱动以及高效的多级菜单系统设计,旨在提供一个稳定、实用且易于移植的嵌入式健康监测项目参考。

weixin_29256771的博客 396

dell r630 配置raid_DELL服务器RAID配置图文教程

名称解释:Disk Group:磁盘组,这里相当于是阵列,例如配置了一个RAID5,就是一个磁盘组VD(Virtual Disk): 虚拟磁盘,虚拟磁盘可以不使用阵列的全部容量,也就是说一个磁盘组可以分为多个VDPD(Physical Disk): 物理磁盘HS:Hot Spare 热备Mgmt:管理【一】创建逻辑磁盘1、按照屏幕下方的虚拟磁盘管理器提示,在VD Mgmt菜单(可以通过CTRL+P...

weixin_33253741的博客 3510

OC语言——分类和类的本质

一,分类概念 Category分类是OC特有的语言,依赖于类。 作用:在不改变父类的基础上,增加一些方法。 如下是Xcode6.2说明图示:

一个不知退路的码农 861

STM32G0实战:HAL库与LL库Flash操作避坑指南(附HardFault解决方案)

本文深入剖析了STM32G0系列微控制器在Flash操作中常见的HardFault问题,对比了HAL库与LL库在读写擦除操作上的底层差异与潜在陷阱。文章提供了基于寄存器状态分析的精准调试方法,并给出了经过实战检验的解决方案与健壮的代码框架,帮助开发者有效规避数据丢失与系统崩溃风险。

t8u9v0w1x的博客 730

OC分类、类方法、实例方法、OC 基础知识及常用的for/in方法

类方法前面有+,实例方法前面有- 类方法和实例方法的区别在于,类方法不能使用实例变量。 使用类方法主要原因有: 1.类方法的使用不依赖于实例化一个对象,也就是说如果一个功能的实现不需要实例化对象,就可以用类方法来实现。 2.类方法可以隐藏单例,将类方法和单例结合,可以在应用程序的任何地方访问静态实例,而无需使用指向对象的指针或保存他的实例变量。 3.类方法和内存管理相关,分配一个NSAr

richard_如风的专栏 4781

C#上位机+国产PLC+AI:构建自主可控的智能生产线解决方案

全栈国产化智能产线方案并非遥不可及,基于成熟的国产硬件、丰富的.NET生态、快速发展的国产大模型,完全可以搭建出稳定可靠且具备智能能力的生产系统。落地建议采用三步走策略:基础国产化阶段:替换PLC与上位机,实现基础监控与控制功能,解决卡脖子问题,快速验证国产化方案稳定性数据沉淀阶段:完善数据采集与存储,建立设备台账、故障库、工艺库,积累高质量领域数据智能升级阶段:引入国产大模型与知识库,落地故障诊断、工艺优化、预测性维护等智能应用,持续提升产线效率。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 517

C++ Qt6 qml CMakeLists.txt如何添加qrc文件

本文介绍了在Qt6项目中如何通过CMake管理QML图片资源。相比Qt5的qmake,CMake需要手动创建qrc文件并配置CMakeLists.txt。关键步骤包括:1)创建resources.qrc文件并添加图片资源;2)在CMakeLists.txt中设置CMAKE_AUTORCC为ON开启自动资源处理;3)使用qt_add_resources将qrc文件绑定到项目。配置完成后,可通过"qrc:alias"方式引用资源图片,解决了相对路径管理复杂的问题。

琅嬛福地 1453

OC协议和分类

协议是一组方法的接口协议采用下面的格式进行定义@protocol 协议名称// 这里定义协议的接口@required@optional@end。

b1049112625的博客 1253

从 VL02N 拣配到 ABAP 自动化,读懂 SD_DELIVERY_UPDATE_PICKING 的位置和风险

文章摘要:SAP SD模块中,SD_DELIVERY_UPDATE_PICKING函数模块用于处理出库交货单的拣配确认,更新交货项目的拣配数量。该函数适用于未启用WM/EWM的传统SD流程,能确保拣配状态与标准交货处理逻辑同步,比直接修改数据库更安全。但在S/4HANA Cloud等新环境中,应优先使用API_OUTBOUND_DELIVERY_SRV等公开发布接口。使用该函数时需注意参数完整性和按交货单整体处理的原则,避免逐项提交导致的数据不一致问题。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 243

oc分类和swift扩展有哪些区别

特性Objective-C 分类Swift 扩展作用对象仅 Objective-C 类类、结构体、枚举、协议存储属性❌(需关联对象模拟)❌计算属性❌✅方法覆盖⚠️ 允许(有风险)❌ 编译禁止协议默认实现❌✅泛型支持❌✅(通过**where**子句)安全性低(运行时冲突)高(编译时检查)需动态添加属性/覆盖方法 →Objective-C 分类(需谨慎)。需类型安全/添加计算逻辑/扩展协议 →Swift 扩展。

chenzimin_blog 1112

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OC的对象的分类

OC的对象分类 一 oc的对象分类主要分为3种 1 instance 对象: 实例对象就是通过alloc 出来的对象,一个类每一次的alloc都会产生一个新的实例对象 StudentA *a = [[StudentA alloc]init]; StudentA *b = [[StudentA alloc]init]; // 打印结果如下 地址是明显不同的 ...

github_36850997的博客 307

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

OC-再谈分类与拓展

最近在翻看学长的博客时,偶然看到关于属性关键字的内容,联想到刚开始学习OC时学长的一个问题,是有关于分类和拓展那个可以添加属性。当时只是简单记了结论,借此机会重新了解了一下具体原因。

2501_91546205的博客 460

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

OC对象 - 关联对象(如何给分类添加成员变量)

Category(分类)的底层结构中,没有成员变量(ivar),因此不能给分类添加成员变量;在分类里面声明的属性,只会生成 get/set 方法的声明,没有方法的实现。给分类添加的成员变量,他并不是保存在该结构体下,因为Category(分类)的底层结构中并没有。所以我们不能直接给分类添加成员变量,但是可以间接实现,那就是使用。关联对象是通过这四个核心对象共同完成的,他们之间的关系是这样的。可以看到我们像正常使用对象的属性一样,使用分类中创建的属性。,这点我们在使用的时候需要注意。我们上面的示例,使用的。

sharp521的博客 1578

OC分类(Category)的作用和注意事项

AppleEngineer 771

ios-OC和Swift混编调用分类问题

在OC和Swift混编的时候,如果我们创建的工程是OC的工程是可以调用Swift中的exrension 分类的,但如果我们创建的工程是Swift工程就是,OC是无法调用Swift中的分类的,今天正好碰到了。记录下

rv0p111 937

黑马程序员---OC分类-category

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———

Halo的专栏 672

OC之分类

一、分类 (一)分类的基本知识  概念:Category  分类是OC特有的语言,依赖于类。 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法。 添加一个分类: 文件结构图:   在分类中添加一个方法   Study方法的实现   测试程序:   (二)分类的使用注意 (1)分类只能增加方

Shicuf的专栏 451

Swift -《从0到1 - 2》:swift使用oc分类和swift创建分类

GitHub Demo 地址 在oc项目中,可以通过分类对原有类进行扩展 但是在swift项目中,没有分类这种概念,相对应的有扩展Extensions 下面是swift中扩展(Extensions)的说明 扩展就是向一个已有的类、结构体、枚举类型或者协议类型添加新功能(functionality)。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模)。扩展和 Objective-C 中的分类(categories)类似。(不过与 Objective-C 不同的是,Swift 的扩展没.

iotjin的专栏 3081

OC分类

概念:Category  分类是OC特有的语言,依赖于类。 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法。 添加一个分类:

coyote_wsf的专栏 516

OC中分类的使用

在oc中,如果想对某个类进行方法的扩充,又不想改变原有累的方法和成员变量,可以使用分类 分类-Category 基本用途 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 继承分类(Category) 格式 分类的声明 @interface 类名 (分类名称) // 方法声明 @end 分类的实现 @implementati

u011349387的专栏 1013

OC 分类

一、分类 (一)分类的基本知识  概念:Category  分类是OC特有的语言,依赖于类。 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法。 添加一个分类: 文件结构图:   在分类中添加一个方法   Study方法的实现   测试程序:   (二)分类的使用注意 (1)分类只能增加方

wxl1380610的专栏 906

OC中的分类和协议

OC中经常使用分类和协议,分类和协议在项目后期可能会经常用到,尤其是为某个已经成熟的模块添加功能的时候。因为:  1,使用分类(category)可以以模块的方式向类添加方法.  2,创建标准化的方法类表供其他人实现.       下面将对分类和协议做一个详细介绍。 一、分类       使用场景: 1,有时候在处理类定义时,可能想要为其添加一些新方法.

Shicuf的专栏 625
上一篇: OC的对象的分类
下一篇: iOS KVO 的实现原理
Leonardo_Fibonacci
博客等级 码龄10年 110粉丝 247原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值