object-c的Categories

Objective-C的Categories和Protocols编程 Objective-C是一种面向对象的编程语言,它提供了一些强大的特性,例如Categories和Protocols,用于扩展和协议定义。这篇文章将介绍Objective-C中的Categories和Protocols,并提供相应的源代码示例。 阅读详情
Categories允许用户为某个类添加新的方法(不能添加新的数据成员),而不用继承的方式来实现。并且,即使没有某个类的实现源码,仍然可以这样做。实例如下:
一.  例1:在不用Fraction源码的情况下,为Fraction添加几个数学(math)方法。 
1. 代码: 
    需要把之前编译好的Fraction.o和Fraction.h放到和下面文件的同一个目录下,例如,这里是FractionMath目录。 
   //1. FractionMath.h
#import "Fraction.h"


@interface Fraction (Math)
-(Fraction*) add: (Fraction*) f;
-(Fraction*) mul: (Fraction*) f;
-(Fraction*) div: (Fraction*) f;
-(Fraction*) sub: (Fraction*) f;
@end
    //2. FractionMath.m
#import "FractionMath.h"


@implementation Fraction (Math)
-(Fraction*) add: (Fraction*) f {
    return [[Fraction alloc] initWithNumerator: numerator * [f denominator] +
                                                denominator * [f numerator]
                             denominator: denominator * [f denominator]];
}


-(Fraction*) mul: (Fraction*) f {
    return [[Fraction alloc] initWithNumerator: numerator * [f numerator]
                             denominator: denominator * [f denominator]];


}


-(Fraction*) div: (Fraction*) f {
    return [[Fraction alloc] initWithNumerator: numerator * [f denominator]
                             denominator: denominator * [f numerator]];
}


-(Fraction*) sub: (Fraction*) f {
    return [[Fraction alloc] initWithNumerator: numerator * [f denominator] -
                                                denominator * [f numerator]
                             denominator: denominator * [f denominator]];
}
@end


//3. main.m
#import <stdio.h>
#import "Fraction.h"
#import "FractionMath.h"


int main( int argc, const char *argv[] ) {
    // create a new instance
    Fraction *frac1 = [[Fraction alloc] initWithNumerator: 1 denominator: 3];
    Fraction *frac2 = [[Fraction alloc] initWithNumerator: 2 denominator: 5];
    Fraction *frac3 = [frac1 mul: frac2];


    // print it
    [frac1 print];
    printf( " * " );
    [frac2 print];
    printf( " = " );
    [frac3 print];
    printf( "\n" );


    // free memory
    [frac1 release];
    [frac2 release];
    [frac3 release];


    return 0;
}


2. 编译运行:
gcc -fconstant-string-class=NSConstantString -c main.m -I /GNUstep/System/Library/Headers
gcc -c FractionMath.m -I /GNUstep/System/Library/Headers
gcc main.o Fraction.o FractionMath.o -o main -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base


$ ./main.exe
1/3 * 2/5 = 2/15


3.说明:
  (1) 必须将 Fraction.o和Fraction.h放在代码的同一个目录下,这才能引用到,否则,在链接的时候就找不到Fraction类。 


二. 例2:      在C++(或Java)那样,对类的方法可以用private/protected/public来限制类方法的访问防属性;然而,在object-c中,却没有这样的规定(有的只是对成员变量的限制),  现在,可以用 categories 来实现这样的功能。实例如下:


    1. 代码:
    //1.  ClassA.h
#import <Foundation/NSObject.h>


@interface ClassA: NSObject 


-(void) print;
@end 


//2. ClassA.m
#import "ClassA.h"


@implementation ClassA


//在.h中有声明,这是个public方法
-(void) print {
    printf( "this is a public method\n");
}
@end


// private 方法
@interface MyClass (Private)
-(void) privateMethod;
@end


@implementation MyClass (Private)
-(void) privateMethod {
    printf( "this is a private method\n" );
}
@end




//3. main.m
#import <stdio.h>
#import "ClassA.h"


int main( int argc, const char *argv[] ) {
    // create a new instance
    ClassA *a = [[ClassA alloc] init];


    [a print];
    printf( "\n" );
    
    //下面这个函数会编译出错,因为这个函数是在.m中声明的,不能被外部访问,这就间接实现了private功能。
    //[a privateMethod];
    return 0;
}


二. 编译运行(略) 
三. 说明:

    (1) 在.h中声明的print函数可以认为是public的; 
    (2) 在.m中用 "@interface MyClass (Private)"方式声明的,不能被外部访问,所以,间接的实现了private功能。
    (3) 当然,可以把"private"改为其它的单词,例如"aaaaaaa",都是可以的;

    (4) 对比例一,关键的区别是这个声明是在.h中声明的,还是在.m中声明的,如果是前者,那么,在外部就可以访问,本来的目就是为类扩展函数,正如例1一样;  如果在.m中声明,那么,外部就访问不到了。

    (5) 从另一个角度理解,在访问一个类的时候,需要import .h头文件的,如果在.h文件中没有相应函数的声明,那么,就会出现编译错误了,这也很容易理解。

21、Objective-C 中类别(Categories)和类扩展(Class Extension)的使用指南 本文深入探讨了Objective-C中的类别(Categories)和类扩展(Class Extension)的创建、使用及其优缺点,并提供了实际应用场景的示例代码。通过合理使用类别和类扩展,开发者可以更高效地组织和扩展代码,提高代码的可维护性和灵活性。文章还详细介绍了如何在不同场景下选择类别或类扩展,并提供了代码规范和实际项目案例。 阅读详情

相关推荐

22、Objective-C 中类别(Categories)与类扩展(Class Extension)的使用指南

本文详细介绍了Objective-C中的两个重要特性:类别(Categories)和类扩展(Class Extension)。通过具体示例,讲解了它们的声明、实现方式以及在实际开发中的应用场景,如功能扩展、代码拆分、信息隐藏等。同时分析了它们的优缺点及使用注意事项,帮助开发者更好地组织代码,提高程序的可维护性和健壮性。

ss78901的博客 200

COCO_01 数据集介绍 COCO目标检测分割数据集格式

COCO简单的目标检测与分割数据集

今晚看星星的博客 4547

101_ObjectCategories

深度学习方向101个物体的数据集,卷积神经网络一定会用到

objective-c的categories(分类)

objective-c的categories(分类)  一,当你想要为某个class 新增methods,你通常会扩充(extend,即继承)它。然而这不一定是个完美解法,特别是你想要重写一个class 的 某个功能,但你却没有原始码时。Categories 允许你在现有的class 加入新功能,但不需要扩充它。Ruby 语言也有类似的功能。 例子一: 1,MyObjectCate

tenfyguo的技术专栏 3618

Abaqus 2023 保姆级安装避坑指南:从环境变量到许可证配置,一次搞定

本文提供Abaqus 2023的详细安装指南,涵盖环境变量设置、许可证配置等关键步骤,帮助用户避开常见安装陷阱。通过系统环境检查、目录结构规划、许可证服务器安装及Java环境配置等实用技巧,确保顺利完成安装并优化软件性能。

weixin_42524276的博客 425

DS18B20温度传感器项目实战:从驱动编写到LCD显示,打造你的第一个温控系统

本文详细介绍了如何使用DS18B20温度传感器和LCD1602显示屏构建一个完整的温控系统。从硬件连接、OneWire协议实现到温度数据采集与LCD显示,全面解析了系统整合与工程化实现的关键步骤,帮助开发者快速掌握嵌入式温度监测系统的开发技巧。

weixin_42525328的博客 349

Object-C中的Category

Object-C中的Category其实是一种对于类的方法的扩充,有些类似于类的继承,但是和继承还是不一样的。下面我 们通过一个例子还说明一个OC中的Category的不同。 首先是.h文件,一般的命名规范为这样NSString+ReverseString.h,具体的代码如下 // // NSString+ReverseString.h // Catagory // // Cre...

iteye_2022的博客 233

多仓智能订单路由与动态优化方案设计

现在有很多商家会有多个仓库,并分布在不同的城市中,当用户下单后会根据商品库存及订单信息将订单分配到对应的仓库进行发货,如就近原则,本期基于多仓库设计一套订单路由方案,包含核心逻辑、规则优先级和实施方案,适用于多仓协同的订单自动分配场景

14年产品经理老兵,想把自己的经验及总结分享给大家,只讲思路及实操,不讲废话 2477

Object C的Categories

Category提供一种为某个类添加方法而又不必编写子类的途径。 假设有这样一个类CarInfo: #import    @interface CarInfo : NSObject {   }   -(void)sayCarBrand;   @end   @implementation CarInfo   -(void) sayCarBrand{

mincheat的专栏 534

从手机到单片机:聊聊ARM Cortex家族那些事,A、R、M系列到底有啥不同?

本文深入解析ARM Cortex家族的A、R、M三大系列处理器,揭示它们在性能、实时响应和能效方面的核心差异。从智能手机到汽车电子和物联网设备,Cortex-A、R、M各司其职,分别应对复杂运算、实时控制和超低功耗场景。通过技术指标对比和典型应用案例,帮助开发者理解如何根据DMIPS/MHz等关键参数选择适合的处理器架构。

weixin_31574149的博客 350

父子Agent架构:解决AI系统上下文污染的技术方案

在AI系统设计中,上下文管理是核心挑战之一。传统单Agent架构在处理复杂任务时,常面临上下文无限膨胀导致的信息淹没和性能下降问题。父子Agent架构通过职责分离和上下文隔离机制,采用分而治之的思想,将大任务拆解为多个子任务由专门子Agent处理。该架构中父Agent负责任务规划和结果汇总,子Agent执行具体任务后立即销毁中间状态,通过精炼摘要进行通信。这种设计不仅能有效控制上下文长度,还能提升系统稳定性和执行效率,特别适用于编程辅助、自动化测试等需要多步骤处理的场景。父子Agent架构体现了计算机科学中

weixin_42531710的博客 352

object-c 中的 Categories

http://www.otierney.net/objective-c.html#downloading

a564941464的专栏 228

R语言生存分析

自己整理编写的R语言常用数据分析模型的模板,原文件为Rmd格式,直接复制粘贴过来,作为个人学习笔记保存和分享。部分参考薛毅的《统计建模与R软件》和《R语言实战》生存分析是研究生存时间的分布规律,以及生存时间和相关因素之间关系的一种统计分析方法。生存分析在医学科学研究中具有广泛而重要的应用价值,它对人群寿命的研究,各种慢性疾病的现场追踪研究,临床疗效试验和动物试验等研究中随访资料的处理骑着举足轻重的作

Tiaaaaa的博客 2万+

Object-C Categories和Protocols

Category 要扩展一个不可修改的类,通常的做法是为该类创建一个子类,在子类中实现想要实现的方法,在Object-C中,可以通过category来实现,并且实现方式更为简单。 现在有如下定义:一个包含4个方法的Fraction类 1 @interface Fraction : NSObject 2 @property int num, den; 3 4 -(void) setT

独领fengsao的猫 815

【智能车Code review】—曲率计算、最小二乘法拟合

【1】曲率计算函数 选三个点计算曲率 float process_curvity(byte x1, byte y1, byte x2, byte y2, byte x3, byte y3) { float K; int S_of_ABC = ((x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)) / 2; //面积的符号表示方向 byte q1 = (byte)((x2 - x1) * (x2 - x1) + (y2 - y1) *

hanhan的博客 1万+

排队论 | 排队论建模方法

排队论 | 排队论建模方法

算法如诗的博客 352

Building Objective-C static libraries with categories

Technical Q&A QA1490 Building Objective-C static libraries with categories // 用类目 编译Object-C 静态库 Q:  Why do I get a runtime exception of "selector not recognized" when linking against an Ob

谁的青春不迷茫 1085

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Object c的优缺点

Objective-C是非常“实际”的语言。它使用1个用C写成、很小的运行库,只会令应用程序的大小增加很小,和大部分OO系统使用极大的VM执行时间会取代了整个系统的运作相反,ObjC写成的程序通常不会比其原始码大很多。而其函式库(通常没附在软件发行本)亦和Smalltalk系统要使用极大的内存来开启1个窗口的情况相反。 Objective-C的最初版本并不支持垃圾回收。在当时这是争论的焦点之一,

西毒 2490

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

object c 高效率和java_object-c 和 Java 的简单对比

object-c的一些点object-c通常写作objective-c或者obj-c,是根据C语言所衍生出来的语言,继承了C语言的特性,是扩充C的面向对象编程语言。Java是一种简单的,跨平台的,面向对象的,分布式的,解释的,健壮的Java分为三个体系Java SE(J2SE,Java2 Platform Standard Edition,标准版),JavaEE(J2EE,Java 2 Platf...

weixin_42393526的博客 583

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

作为Object C语法的特性之一Posing

Posing 扮演:作为Object C语法的特性之一。 通过poseAs方法来做到扮演的目的。 扮演的作用:无需要定义子类对象和初始化,就可以通过父类扮演子类来操作 。(等价于子类的直接操作,类似父类转子类)。 例子: #import "Fraction.h" @interface FractionB: Fraction -(void) print; @end

sxwlyp924app的专栏 557

OC的Categories(分类)

作者:近乎团队 今天给大家分享一下OC的Category技术。  一:当你想要为某个类新增方法时,你通常会继承它。然而这不一定是个完美的方法,特别是你想要重写一个类的的某个功能,但你却没有原始码。Categories 允许你在现有的类加入新功能,但不需要继承它。 例子一: 1,MyObjectCateName.h: #import    #import "MyObject.h"  

juanxi6678的博客 395

Object-C:Posing(扮演)

Posing 扮演:作为Object C语法的特性之一。 通过poseAs方法来做到扮演的目的。 扮演的作用:无需要定义子类对象和初始化,就可以通过父类扮演子类来操作 。(等价于子类的直接操作,类似父类转子类)。 例子: #import "Fraction.h" @interface FractionB: Fraction -(void) print; @end @implem

mincheat的专栏 602

object-c小结

XCode:可以把它看成是一个开发环境,就好像VisualStudio或者Netbeans或者SharpDevelop一样的玩意。可以将Interface Builder认为是VisualStudio中用来画界面的那部分功能单独提出来的程序。 Objective-C:这是一种语言,就好像c++是一种语言,Java是一种语言,c#是一种语言,莺歌历史也是一种语言一样。 Coc

ibmyself的专栏 698

2023最新中级难度Objective-C面试题,包含答案。刷题必备!记录一下。

好记性不如烂笔头内容来自。

m0_62946064的博客 1830
上一篇: object-c的动态识别与isKindOfClass,isMemberOfClass等
下一篇: object-c的protocol(协议)
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值