黑马程序员---OC Category
2015-08-08 21:41
375 查看
类别的作用
使用类别的目的
1)对现有类进行扩展:
可以扩展Cocoa touch框架中的类,在类别中增加的方法会被子类所继承,而且在运行时跟其他的方法没有区别。
2)作为子类的替代手段:不需要定义和使用一个子类,可以通过类别直接向已有的类里增加方法。
3)对类中的方法归类:利用category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方法进行更新和维护。
在.h文件中,声明类别:
@interface ClassName (CategoryName)
NewMethod; //在类别中添加方法,不允许在类别中添加变量
@end
声明类别格式
1)新添加的方法必须写在
@interface 与@end之间
2)ClassName
现有类的类名(要为哪个类扩展方法)
3)CategoryName
待声明的类别名称
4)NewMethod
新添加的方法
在.m文件中(也可以在.h中实现),实现类别:
@implementation ClassName(CategoryName)
{
......
}
@end
实现类别格式
1)新方法的实现必须写在@
implementation与@end之间
2)ClassName
现有类的类名
3)CategoryName
待声明的类别名称
4)NewMethod
新添加的方法的实现
分类的使用注意事项
1)分类只能增加方法,
不能增加成员变量、@property(可能编译不报错,但是运行有问题
@interface
Person (study)
@property int age;
-(void)study;
-(void)work;
@end
#import
<Foundation/Foundation.h>
#import
"Person.h"
#import "Person+study.h"
int main(int
argc, const char
* argv[]) {
@autoreleasepool
{
Person *p = [Person
new];
[p
eat];
[p run];
p.age = 10;
}
return
0;
}
分类可以访问原来类中的成员变量
如:
#import <Foundation/Foundation.h>
//原类
@interface
Person : NSObject
{
@public
int _age;
}
@end
//类别
@implementation Person (study){
- (void)study{
NSLog(@"age = %d",_age);
}
@end
int main(int argc,
const char * argv[]) {
@autoreleasepool {
//对象
Person *p = [Person
new];
[p study];
}
return
0;
}
非正式协议
非正式协议就是给NSObject类创建的类目(分类)又叫做非正式协议, 非正式协议一般不需要进行实现,一般在子类中进行方法的重写。
统计一个字符串中阿拉伯数字的个数
NSString *str = @"ada12sfasdf1213234asfda 32424 121 aa11afdsf";
@interface
NSString (count)
-(void)countStrNum;
@end
@implementation
NSString (count)
-(void)countStrNum{
int
count=0;
//遍历字符串
for(int
i=0;i<self.length;i++){
//获取字符串的每一个字符
unichar c = [self
characterAtIndex:i];//判断是否是阿拉伯数字
if (c>='0'
&& c<='9') {
//如果是阿拉伯数字,则+1
count++;}
}
NSLog(@"count = %d",count);}
在不修改原有的类的基础上增加新的方法 一个庞大的类可以分模块开发 一个庞大的类可以由多个人来编写,更有利于团队合作
使用类别的目的
1)对现有类进行扩展:
可以扩展Cocoa touch框架中的类,在类别中增加的方法会被子类所继承,而且在运行时跟其他的方法没有区别。
2)作为子类的替代手段:不需要定义和使用一个子类,可以通过类别直接向已有的类里增加方法。
3)对类中的方法归类:利用category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方法进行更新和维护。
在.h文件中,声明类别:
@interface ClassName (CategoryName)
NewMethod; //在类别中添加方法,不允许在类别中添加变量
@end
声明类别格式
1)新添加的方法必须写在
@interface 与@end之间
2)ClassName
现有类的类名(要为哪个类扩展方法)
3)CategoryName
待声明的类别名称
4)NewMethod
新添加的方法
在.m文件中(也可以在.h中实现),实现类别:
@implementation ClassName(CategoryName)
{
......
}
@end
实现类别格式
1)新方法的实现必须写在@
implementation与@end之间
2)ClassName
现有类的类名
3)CategoryName
待声明的类别名称
4)NewMethod
新添加的方法的实现
分类的使用注意事项
1)分类只能增加方法,
不能增加成员变量、@property(可能编译不报错,但是运行有问题
@interface
Person (study)
@property int age;
-(void)study;
-(void)work;
@end
#import
<Foundation/Foundation.h>
#import
"Person.h"
#import "Person+study.h"
int main(int
argc, const char
* argv[]) {
@autoreleasepool
{
Person *p = [Person
new];
[p
eat];
[p run];
p.age = 10;
}
return
0;
}
分类可以访问原来类中的成员变量
如:
#import <Foundation/Foundation.h>
//原类
@interface
Person : NSObject
{
@public
int _age;
}
@end
//类别
@implementation Person (study){
- (void)study{
NSLog(@"age = %d",_age);
}
@end
int main(int argc,
const char * argv[]) {
@autoreleasepool {
//对象
Person *p = [Person
new];
[p study];
}
return
0;
}
非正式协议
非正式协议就是给NSObject类创建的类目(分类)又叫做非正式协议, 非正式协议一般不需要进行实现,一般在子类中进行方法的重写。
统计一个字符串中阿拉伯数字的个数
NSString *str = @"ada12sfasdf1213234asfda 32424 121 aa11afdsf";
@interface
NSString (count)
-(void)countStrNum;
@end
@implementation
NSString (count)
-(void)countStrNum{
int
count=0;
//遍历字符串
for(int
i=0;i<self.length;i++){
//获取字符串的每一个字符
unichar c = [self
characterAtIndex:i];//判断是否是阿拉伯数字
if (c>='0'
&& c<='9') {
//如果是阿拉伯数字,则+1
count++;}
}
NSLog(@"count = %d",count);}
相关文章推荐
- 黑马程序员--java基础--基础语法
- 黑马程序员——Java基础---IO(二)---IO字节流、流操作规律
- 黑马程序员--IO流之字节流
- StackOverflow程序员推荐:每个程序员都应读的30本书
- 《程序员面试宝典3》大量错误(50+)纠正表
- Java后台工程师面试杂记——不跳不涨工资星人跳槽经历
- 剑指offer_面试题12_打印1到最大的n位数(大数问题)
- 【剑指Offer面试题】 九度OJ1373:整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指Offer面试题30(java版):最小的k个数
- 黑马程序员——Java中的一个关于参数传递的小问题
- 20个高级Java面试题汇总
- 黑马程序员——Java基础---IO(一)---IO流概述、字符流
- java---面试题---.java"源文件中可以包括多个类(不是内部类)
- 剑指Offer面试题29(java版):数组中出现次数超过一半的数字
- 如何在面试中发现优秀程序员
- 黑马程序员--IO流总述
- GNU Binary Utilities的笔记
- 黑马程序员-----Java基础-----数组!
- mysql基本语法及面试常见问题
- 程序员面试题目:Cracking the coding interview 分析与解答