Objective-C中的类目(Category),延展(Extension)
类目和延展的作用都是为了扩展一个类。
Objective-C中的类目(Category)
一、类目的定义和作用
类目也叫分类,英文Category,在没有原类.m文件的基础上,给该类添加方法。
比如,NSString类原本没有helloString方法,我们又没有NSString类的原代码,那我们想给NSString类添加一个helloString的方法,只有通过声明子类或者类目才可以达到这个目的。
二、类目的声明:
@interfaceNSString (hello)
- (void)helloString;
@end
三、类目实现:
@implementationNSString (hello)
- (void)helloString
{
NSLog(@"my name is %@,I am a string",self);
}
@end
文件名:
NSString+hello.h
使用:
NSString * str = @"我要上天";
[strhelloString];
打印输出:
my name is 我要上天,I am a string
helloString 实现里面用到的self就是调用这个方法的实例本身。
四、类目使用需要注意的问题:
1、类目里不能添加实例变量,但是类目声明可以用属性,其实属性就是一对儿方法,那么在.m里面需要实现这个属性的setter方法和getter方法,在这两个实现方法里面依然不能使用自己添加的实例变量。
2、类目里添加的方法不能和原始类中的方法重名,否则会导致覆盖。
3、一个类可以添加多个类目,但是类目名和方法名不能重复。
4、类目中的方法可以成为原始类的一部分,和原始类方法级别相同,可以被子类继承。
局限性: 在类目中只可以为类添加方法,不能添加实例变量; 类目中得方法的优先级要高。
Objective-C中的延展(Extension)
延展也叫Extension:
延展是一种特殊形式的类目,主要是在一个类的.m里面声明与实现
延展的作用:就是给某类添加私有方法或私有变量
比如RootViewController.m
@interface RootViewController ()
{
NSString * aString ;
}
- (void)test1;
- (void)test2;
@end
@implementation RootViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNilbundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
@end
上面@interface @end定义的就是一个延展,主要定义了RootViewController的私有方法和私有变量。
五、使用延展需要注意的几个问题:
1、如果括号里没有类目名,则认为延展里面的方法为全都必须实现,如果有名,则认为是可选实现。
2、虽然延展是给一个类定义私有方法,但是没有OC没有绝对的私有方法,其实还是可以调用,另外延展里面声明的变量只能在该类内部使用,外界访问不了。
3、如果是新建文件建的某类延展.h文件,则不能加实例变量。
Objective-C中的类目(Category),延展(Extension)的更多相关文章
- Objective-C中的类目,延展,协议
Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...
- OC中协议, 类目, 时间, 延展, 属性
只有继承和协议需要引IMPORT "头文件"; 必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @pr ...
- object-c中的类目,延展,协议
协议 协议只有方法的声明(类似于其他编程语言的接口) 协议相当于大家都所遵循的 关键字 @protocol 协议名 <所遵循的协议> 默认NSObject @end @pr ...
- objective-c 类目(Category)和延展(Extension)
类目的基本概念: 如果有封装好的一个类,随着程序功能的增加,需要在类中增加一个方法,那我们就不必在那个类中做修改或者再定义一个子类,只需要在用到那个方法时添加一个该类的类目即可. 1.在类目定义的方法 ...
- iOS类目、延展和协议
类目:为已知的类增加新的方法:注意:类目里面只能写方法,不能写声明和属性,所以,类目不能作为接口来用 1.类目无法向已有类中添加实例变量.2.如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优 ...
- Java生鲜电商平台-生鲜电商中商品类目、属性、品牌、单位架构设计与实战
Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战 说明:Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战经验分享 凡是涉及到购物,必然是建立在商品的基础 ...
- OC 中 类目、延展和协议
Category : 也叫分类,类目. *是 为没有源代码的类 扩充功能 *扩充的功能会成为原有类的一部分,可以通过原有类或者原有类的对象直接调用,并且可继承 *该方法只能扩充方法,不能扩充实例变量 ...
- iOS -类目,延展,协议
1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. @interface NSMutableArray ( ...
- Object-C里的类目,延展,协议
1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. @interface NSMutableArray ( ...
随机推荐
- python 序列(list,tuple,str)基本操作
添加元素: mylist.append() mylist.extend([1, 2]) mylist.insert(1, "pos") 删除元素: mylist.remove(va ...
- java final 关键字醍醐灌顶
醍醐灌顶: final 关键字,它可以修饰数据 .方法.类. 可能有些同学傻傻分不清出,这里可以快速弄懂final; final 实例域: 可以将实例域定义为final,构建对象时必须初始化这样的域, ...
- css3选择器的比较(三) -- 元素选择器 (+, ~)
元素选择器中w3cschool中有些翻译不太准确 比如 +:其实是与element1元素同级,位于element1元素之后的第一个element2元素 ~:其实是与element1元素同级,位于ele ...
- ASP.NET快速开发框架、这才是高大上档次后台管理UI界面
另外献上在<线体验Demo地址>希望大家也能从中得到一些启发.地址:http://121.40.148.178:8080/ . 用户名:guest,密码:123456QQ技术交流群:239 ...
- 快速检查SQL两表数据是否一致
1前话 项目内实现了一新功能:克隆数据库. 2目标 克隆并非用SQLSERVER克隆,故完毕后需要检查各表内一些数据与原表一致性.一些表中的某一些列容许不一致. 3实现 将两表的需要检查的几列取出,相 ...
- ES配置详解
elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来 ...
- 使2个div 在一行上显示
<!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...
- 向ibus-table-wubi里添加属于自己的输入法(98五笔)
写在前面: 第三步整理每行的结构相对来说算是最难的,我的方法是先用文本编码转换专家将文本编码转换成utf-8无BOM(linux下有转换命令不会用,一定要是无BOM否则会在linux下打开乱码),再用 ...
- WebAppScaner
https://www.ohloh.net/p/simple-scan/ https://code.google.com/p/skipfish/ http://code.google.com/p/wa ...
- Protel99se教程五:protel99se的自动布线
在上一节课的protel99se教程中,我们给大家演示的是,如何快速的将SCH原理PCB,也就是将元件转到PCB中,在这一节课,我们主要给大家讲解的是何在protel99se快速布线,我们在这节课当中 ...