OC中的Category类别_@implementation category-程序员宅基地

技术标签: OC  Category类别  

类别是一种为现有的类添加新方法的方式。

 @interface NSString (NumberConvenience)
- (NSNumber *)lengthAsNumber;
@end
(1)为NSString类添加一个名称为NumberConveniencede的类别;类别名称具有 唯一性 ,你可以向一个类中添加 任意多 的类别。
(2)可以指定希望向其添加类别的类(NSString),以及类别的名称(NumberConvenience),而且你还可以 列出添加的方法 ,最后以@end结束;类别声明部分 不能有实例变量部分
实现类别
@implementation NSString (NumberConvenience)
- (NSNmuber *)lengthAsNumber{
       unsigned int length = [self length];//获得字符串长度
       return ([NSNumber numberWithUnsignedInt :length]);

@end
#import  <Foundation/Foundation.h>
#import  "CategoryThing.h"
//类别的作用:
//(1)将类别实现分散到多个不同文件或多个不同框架中
//(2)创建私有方法的前向引用
//(3)向对象添加非正式协议
//类别的局限性:
//(1)无法添加新的实例变量
//(2)名称冲突,如果类别和现有的方法重名,类别具有更高的优先级,解决办法,类别方法名中添加一个前缀
@interface  NSString (NumberConvenience)
- ( NSNumber  *) lengthAsNumber;
@end
@implementation  NSString (NumberConvenience)
- ( NSNumber  *) lengthAsNumber
{
unsigned   int  length= [ self   length ];
return  ([ NSNumber   numberWithUnsignedInt :length]);
}
@end
int  main ( int  argc,  c*****t   char  * argv[]) {
//我们适用类别创建的所有NSNumber类的对象将在自动释放池中被销毁一样,可变字典也将在这里被销毁
NSAutoreleasePool  * pool = [[ NSAutoreleasePool   alloc init ];
// insert code here...

NSMutableDictionary  *dict;
dict=[ NSMutableDictionary   dictionary ];

//使用键@“hello”将整值5添加到字典中的代码如下
[dict  setObject :[ @"hello"   lengthAsNumber forKey @"hello" ];

[dict  setObject :[ @"iLikeFish"   lengthAsNumber forKey @"iLikeFish" ];

[dict  setObject :[ @"Once upon a time"   lengthAsNumber forKey @"Once upon a time" ];

     NSLog ( @"%@" ,dict);

CategoryThing  *thing;
thing= [[ CategoryThing   alloc init ];

[thing  setThing1 : 5 ];
[thing  setThing2 : 23 ];
[thing  setThing3 : 42 ];

NSLog ( @"Thing are %@!" ,thing);

[thing  release ];

    [pool  drain ];
     return   0 ;
}
//
//  CategoryThing.h
//  S12_leibie
//
//  Created by cwity on 11-5-17.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import  <Cocoa/Cocoa.h>
@interface  CategoryThing : NSObject {
int   thing1 ;
int   thing2 ;
int   thing3 ;
}
@end
@interface  CategoryThing (Thing1)
- ( void ) setThing1:( int thing1 ;
- ( int ) thing1;
@end
@interface  CategoryThing (Thing2)
- ( void ) setThing2:( int thing2 ;
- ( int ) thing2;
@end
@interface  CategoryThing (Thing3)
- ( void ) setThing3:( int thing3 ;
- ( int ) thing3;
@end
//
//  CategoryThing.m
//  S12_leibie
//
//  Created by cwity on 11-5-17.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import  "CategoryThing.h"
@implementation  CategoryThing
- ( NSString  *) description
{
NSString  *desc;
desc= [ NSString   stringWithFormat : @"%d %d %d" ,
     thing1 , thing2 , thing3 ];

return  (desc);
}
@end
//
//  Thing1.m
//  S12_leibie
//
//  Created by cwity on 11-5-17.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import  "CategoryThing.h"
@implementation  CategoryThing (Thing1)
- ( void ) setThing1:( int )t1
{
thing1 =t1;
}
- ( int ) thing1
{
return  ( thing1 );
}
@end
//
//  Thing2.m
//  S12_leibie
//
//  Created by cwity on 11-5-17.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import  "CategoryThing.h"
@implementation  CategoryThing (Thing2)
- ( void ) setThing2:( int )t2
{
thing2 =t2;
}
- ( int ) thing2
{
return  ( thing2 );
}
//
//  Thing3.m
//  S12_leibie
//
//  Created by cwity on 11-5-17.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import "CategoryThing.h"
@implementation  CategoryThing (Thing3)
- ( void ) setThing3:( int )t3
{
thing3 =t3;
}
- ( int ) thing3
{
return ( thing3 );
}
@end


总结:
什么时候使用类别?

(1)类别只能添加新方法,无法添加新的实例变量。

(2)如果类别名和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。

要注意的是Objective-c只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现。

另外要特别注意的是,类别不能像继承时那样给类别接口增加新的实例变量,而是要扩展一个类的行为。
类别的名称是任意的。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_29534945/article/details/46793539

智能推荐

脑电波-使用意念说话-程序员宅基地

文章浏览阅读1.7w次,点赞11次,收藏33次。本人菜鸟一个,程序不够完美,第一次写博客有很多漏洞,希望谅解!!!硬件清单:LCD12864,ARDUINO MEGA2560,蓝牙模块,脑电波传感器,usb音响,树莓派3功能解释:从脑电波模块中解析出人脑数据,实时切换字母,集中注意力采集目标值,目标值通过蓝牙发送给树莓派进行语音合成。简单点说:用意念说话,根据你的生物电信号解析出信息,使用语音合成与人交流存在bug,需要锻炼人的...

【数据增强】——弹性变形(Elastic Distortion)_数据增强随机弹性变换-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏31次。转载自:https://zhuanlan.zhihu.com/p/342274228作者:ChenCver可能应用场景线性场景的语义分割文字识别随笔弹性变形的第二个步骤,和现在语义分割中流行的可学习光流上采样SFnet,采用神经网络来学习随机变化的随机场。1. 前言弹性变形数据增强,本人在看Unet论文时第一次接触到,工作中,经常用到语义分割解决问题,发现在针对线分割的问题,经常都会出现中间断裂的情况。后期经过不断工程验证,发现弹性变形这种数据增强有助于解决该问题,弹性变形论文最早是._数据增强随机弹性变换

python可视化 Task03_axs.set_xticks-程序员宅基地

文章浏览阅读257次。学习参考:https://github.com/datawhalechina/fantastic-matplotlib文章目录1. 墨尔本1981年至1990年的每月温度情况2. 画出数据的散点图和边际分布import numpy as npimport pandas as pdimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus']_axs.set_xticks

tp 双击唤醒 最终方案 实现流程_高通平台tp双击唤醒怎么设置-程序员宅基地

文章浏览阅读4.2k次。双击唤醒_高通平台tp双击唤醒怎么设置

AWS EBS快照创建_aws自动创建快照-程序员宅基地

文章浏览阅读502次。EBS快照创建参数选择&填写资源类型:选择存储卷: 填写需要备份的EBS的卷ID描述: 填写此次快照的描述,方便识别标签: 可以编辑标签,标注这个快照属于哪个EBS卷或者属于卷挂载的机器信息参考文档创建Amazon EBS快照:https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/ebs-creat..._aws自动创建快照

tp5 宝塔open_basedir restriction in effect 错误_thinkphp5 file_put_contents(): open_basedir restri-程序员宅基地

文章浏览阅读707次。_thinkphp5 file_put_contents(): open_basedir restriction in effect. file(/pub

随便推点

时间序列分析古扎拉蒂资源_时间序列-有用的资源-程序员宅基地

文章浏览阅读111次。时间序列分析古扎拉蒂资源 时间序列-有用的资源 (Time Series - Useful Resources)Advertisements 广告 Previous Page 上一页 Next Page 下一页 The following resources contain additional information on Time Series. Pleas..._古*扎资源

把结构体与数组之间的转换_结构体转数组-程序员宅基地

文章浏览阅读9.8k次,点赞2次,收藏12次。二维数组和一维数组的转换很简单,直接是强制转换即可,例如:#include&lt;stdio.h&gt;#include&lt;string.h&gt;unsigned char aa[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};int main(){ int i; for(i = 0;i &lt;..._结构体转数组

Python:输入某年某月某日,判断这一天是这一年的第几天_输入某年某月某日,判断这一天是这一年的第几天python-程序员宅基地

文章浏览阅读1.5k次,点赞3次,收藏6次。需要用户输入三个参数分别是年、月、日并且程序要判断年是闰年还是平年,月是大月还是小月。big:用于计入大月比小月多的一天。m: month 让用户输入月。y: year 让用户输入年。d: day 让用户输入日。day_is: 统计天数。_输入某年某月某日,判断这一天是这一年的第几天python

区间合并(Java)_区间算法java-程序员宅基地

文章浏览阅读2.2k次。区间合并题目描述:给出多组区间,求所有区间的交集输入描述:多个区间,单个区间用逗号隔开,区间之间用空格隔开,例如:2,6 3,8 6,9输出描述:将合并后的区间输出,例如2,6 3,8 6,9合并后输出2,9 1,3 2,6 8,10合并后输出1,6 8,10import java.util.ArrayList;import java.util.Iterator;imp..._区间算法java

python转盘抽奖_python实现大转盘抽奖效果-程序员宅基地

文章浏览阅读435次。本文实例为大家分享了python实现大转盘抽奖的具体代码,供大家参考,具体内容如下选择转盘中的某一个方框,来进行抽奖import tkinter#导入线程模块import threadingimport time #导入代码的sleep 代码休眠root = tkinter.Tk()root.title('大转盘')root.minsize(300,300)#摆放按钮btn1 = tkinter....

甲流病人初筛_目前正是甲流盛行时期,为了更好地进行分流治疗,医院在挂号时要求对病人的体温和咳-程序员宅基地

文章浏览阅读3.4k次,点赞3次,收藏7次。题目描述目前正是甲流盛行时期,为了更好地进行分流治疗,医院在挂号时要求对病人的体温和咳嗽情况进行检查,对于体温超过37.5度(含等于37.5度)并且咳嗽的病人初步判定为甲流病人(初筛)。现需要统计某天前来挂号就诊的病人中有多少人被初筛为甲流病人。输入第一行是某天前来挂号就诊的病人数n。(n < 200)其后有n行,每行是病人的信息,包括三个信息:姓名(字符串,不含空格,最多8个字符)..._目前正是甲流盛行时期,为了更好地进行分流治疗,医院在挂号时要求对病人的体温和咳

推荐文章

热门文章

相关标签