类目和延展的作用和区别?
2016-04-19 17:00
381 查看
类目和延展的作用都是为了扩展一个类。
类目也叫分类,英文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 = @"beijing";
[strhelloString];
打印输出:
my name is beijing,I am a string
helloString 实现里面用到的self就是调用这个方法的实例本身。
四、类目使用需要注意的问题:
1、类目里不能添加实例变量,但是类目声明可以用属性,其实属性就是一对儿方法,那么在.m里面需要实现这个属性的setter方法和getter方法,在这两个实现方法里面依然不能使用自己添加的实例变量。
2、类目里添加的方法不能和原始类中的方法重名,否则会导致覆盖。
3、一个类可以添加多个类目,但是类目名和方法名不能重复。
4、类目中的方法可以成为原始类的一部分,和原始类方法级别相同,可以被子类继承。
延展也叫Extension:
延展是一种特殊形式的类目,主要是在一个类的.m里面声明与实现
延展的作用:就是给某类添加私有方法或私有变量
比如RootViewController.m
@interfaceRootViewController ()
{
NSString * aString ;
}
- (void)test1;
- (void)test2;
@end
@implementationRootViewController
- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil
{
self = [superinitWithNibName:nibNameOrNilbundle:nibBundleOrNil];
if (self) {
// Custominitialization
}
return self;
}
@end
上面@interface @end定义的就是一个延展,主要定义了RootViewController的私有方法和私有变量。
五、使用延展需要注意的几个问题:
1、如果括号里没有类目名,则认为延展里面的方法为全都必须实现,如果有名,则认为是可选实现。
2、虽然延展是给一个类定义私有方法,但是没有OC没有绝对的私有方法,其实还是可以调用,另外延展里面声明的变量只能在该类内部使用,外界访问不了。
3、如果是新建文件建的某类延展.h文件,则不能加实例变量。
类目也叫分类,英文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 = @"beijing";
[strhelloString];
打印输出:
my name is beijing,I am a string
helloString 实现里面用到的self就是调用这个方法的实例本身。
四、类目使用需要注意的问题:
1、类目里不能添加实例变量,但是类目声明可以用属性,其实属性就是一对儿方法,那么在.m里面需要实现这个属性的setter方法和getter方法,在这两个实现方法里面依然不能使用自己添加的实例变量。
2、类目里添加的方法不能和原始类中的方法重名,否则会导致覆盖。
3、一个类可以添加多个类目,但是类目名和方法名不能重复。
4、类目中的方法可以成为原始类的一部分,和原始类方法级别相同,可以被子类继承。
延展也叫Extension:
延展是一种特殊形式的类目,主要是在一个类的.m里面声明与实现
延展的作用:就是给某类添加私有方法或私有变量
比如RootViewController.m
@interfaceRootViewController ()
{
NSString * aString ;
}
- (void)test1;
- (void)test2;
@end
@implementationRootViewController
- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil
{
self = [superinitWithNibName:nibNameOrNilbundle:nibBundleOrNil];
if (self) {
// Custominitialization
}
return self;
}
@end
上面@interface @end定义的就是一个延展,主要定义了RootViewController的私有方法和私有变量。
五、使用延展需要注意的几个问题:
1、如果括号里没有类目名,则认为延展里面的方法为全都必须实现,如果有名,则认为是可选实现。
2、虽然延展是给一个类定义私有方法,但是没有OC没有绝对的私有方法,其实还是可以调用,另外延展里面声明的变量只能在该类内部使用,外界访问不了。
3、如果是新建文件建的某类延展.h文件,则不能加实例变量。
相关文章推荐
- ApachePOI导出exce,设置单元格风格的属性和设置字体风格的属性的两个工具类,POI宽度和excel 像素转换
- 总结一下java中的位操作,运算优先级
- MTK之UART串口收发数据
- 模仿支付宝GridView 分割线实现
- 3D Touch
- SignalR 资料
- C语言易错和易忽视点
- MFC/WTL 设置背景图和控件透明的方法
- 一、svn--windows下安装
- javascript去除字符串左右两端的空格
- IM/即时通讯
- zzuli oj 1873: This offer 【dfs+数组标记技巧(set会超时)】
- Java 将15位身份证号转化为18位返回,非15位身份证号原值返回
- python @ property classmethod staticmethod
- Sublime Text 2 实用快捷键(Mac OS X)
- (转载)C#中使用GUID
- 平衡二叉树旋转
- Android广播BroadcastReceiver
- iOS 9 App 瘦身功能
- 如何应对高负载(如双11服务器压力大)