category的作用:
1.可以在不修改原有类的基础上,为这个类扩充一些方法
2.一个庞大的类可以分模块开发
3.一个庞大的类可以由多个人来编写,更有利于团队合作
方法:
方法的声明:
方法的实现:
所以:通过分类给某一个类扩充方法,也分为声明和实现两个部分
分类的基本格式:
//分类的声明
@interface<#class name#> (<#category name#>)
NewMethod;在类别中添加方法
@end
class name:需要给那个类扩充方法
category name:分类的名称
NewMethod:分类的方法
//分类的实现
@implementation<#class#> (<#category name#>)
NewMethod
<#methods#>
@end
class name:需要给那个类扩充方法
category name:分类的名称
NewMethod:分类的方法
分类的注意:
1.分类是用于给原有类添加方法的,它只能添加方法,不能添加属性(成员变量)
2.分类中的@property,只会生成setter/getter方法的声明,不会生成实现以及私有的成员变量
3.可以在分类中访问原有类中的.h中的属性
注意:如果分类中有和原类有同名的方法,则会调用分类中的方法,也就是说会忽略原有类中的方法
注意:在开发中尽量不要这样写
如果多个分类中都有和原有类中同名的方法,那么调用该方法的时候执行谁由编译器确定,会执行最后一个参与编译的分类中的方法
方法的调用顺序:
1.分类
2.本类
3.父类
1.求字符串的翻转
2.求字符串长度返回NSNumber类型
#import
#import"NSString+fanzhuan.h"
#import"NSString+StringLength.h"
intmain(intargc,constchar* argv[]) {
@autoreleasepool{
NSString*str1 =@"abfhdgfhg";
NSLog(@"%@",[str1Fanzhuan]);
NSLog(@"%@",[str1StringLerth]);
}
return0;
}
#import
@interfaceNSString (StringLength)
//求字符串长度返回NSNumber类型
-(NSNumber*)StringLerth;
@end
#import"NSString+StringLength.h"
@implementationNSString (StringLength)
-(NSNumber*)StringLerth
{
intlen = (int)self.length;
return[NSNumbernumberWithInt:len];
}
@end
#import
@interfaceNSString (fanzhuan)
//字符串的翻转
-(NSString*)Fanzhuan;
@end
#import"NSString+fanzhuan.h"
@implementationNSString (fanzhuan)
-(NSString*)Fanzhuan
{
NSMutableString*strM = [NSMutableStringstringWithCapacity:100];
for(inti = (int)self.length-1; i >=0; i--) {
charch = [selfcharacterAtIndex:i];
[strMappendFormat:@"%c",ch];
}
returnstrM;
}
@end
2.给类添加多个类目时,可以在类里面进行类目的.h文件的方法声明操作 类目只需做.m文件的方法实现的操作
#import
#import"Myclass.h"
intmain(intargc,constchar* argv[]) {
@autoreleasepool{
Myclass*my = [[Myclassalloc]init];
[myselect];
[myadd];
[myupdate];
[mydeletes];
}
return0;
}
#import
/*
类目:
类的方法声明和实现分开
一对多一个.h文件对应多个.m文件
*/
@interfaceMyclass :NSObject
-(void)select;
@end
@interfaceMyclass (CategoryUpdate)
-(void)update;
@end
@interfaceMyclass (CategoryAdd)
-(void)add;
@end
@interfaceMyclass (CategoryDelete)
-(void)deletes;
@end
#import"Myclass.h"
@implementationMyclass
-(void)select
{
NSLog(@"select");
}
@end
#import"Myclass.h"
@implementationMyclass (CategoryUpdate)
-(void)update
{
NSLog(@"update");
}
@end
#import"Myclass.h"
@implementationMyclass (CategoryDelete)
-(void)deletes
{
NSLog(@"deletes");
}
@end
#import"Myclass.h"
@implementationMyclass (CategoryAdd)
-(void)add
{
NSLog(@"add");
}
@end
//类目的基本概念
#import
#import"Person.h"
#import"Person+SportCategory.h"
intmain(intargc,constchar* argv[]) {
@autoreleasepool{
Person*p = [[Personalloc]init];
p.age=33;
[psay];
[pFootball];
[pBasketball];
}
return0;
}
#import
@interfacePerson :NSObject
@property(assign,nonatomic)intage;
-(void)say;
@end
#import"Person.h"
@implementationPerson
-(void)say
{
NSLog(@"age is %d",_age);
}
@end
#import"Person.h"
//类目
/*
category的作用:
1.可以在不修改原有类的基础上,为这个类扩充一些方法
2.一个庞大的类可以分模块开发
3.一个庞大的类可以由多个人来编写,更有利于团队合作
方法:
方法的声明:
方法的实现:
所以:通过分类给某一个类扩充方法,也分为声明和实现两个部分
分类的基本格式:
//分类的声明
@interface <#class name#> (<#category name#>)
NewMethod;在类别中添加方法
@end
class name:需要给那个类扩充方法
category name:分类的名称
NewMethod:分类的方法
//分类的实现
@implementation <#class#> (<#category name#>)
NewMethod
<#methods#>
@end
class name:需要给那个类扩充方法
category name:分类的名称
NewMethod:分类的方法
*/
@interfacePerson (SportCategory)
//扩充方法
-(void)Football;
-(void)Basketball;
@end
#import"Person+SportCategory.h"
@implementationPerson (SportCategory)
//扩充方法的实现
-(void)Football
{
NSLog(@"踢足球");
}
-(void)Basketball
{
NSLog(@"打篮球");
}
@end
类目的注意事项:
#import
#import"Person+Lcj.h"
intmain(intargc,constchar* argv[]) {
@autoreleasepool{
Person*p = [[Personalloc]init];
p.age=23;
// p.height = 1.47;
[psay];
}
return0;
}
#import
@interfacePerson :NSObject
{
double_weight;
}
@property(assign,nonatomic)intage;
-(void)say;
@end
#import"Person.h"
@implementationPerson
-(void)say
{
NSLog(@"age is %d",_age);
}
@end
#import"Person.h"
//1.分类是用于给原有类添加方法的,它只能添加方法,不能添加属性(成员变量)
@interfacePerson (Lcj)
//{
// double _height;
//}
//2.分类中的@property,只会生成setter/getter方法的声明,不会生成实现以及私有的成员变量
//@property(assign,nonatomic) double height;
-(void)hello;
@end
-(void)hello
{
//3.可以在分类中访问原有类中的.h中的属性
NSLog(@"hello %f",_weight);
}
//注意:如果分类中有和原有类中同名的方法,则会调用分类中的方法,忽略了原有类中的方法
//-(void)say
//{
// NSLog(@"%s",__func__);
//}
@end
#import"Person.h"
@interfacePerson (Lnj)
@end
#import"Person+Lnj.h"
@implementationPerson (Lnj)
//如果多个分类中都有和原有类中同名的方法,那么调用该方法的时候执行谁由编译器确定,会执行最后一个参与编译的分类中的方法
-(void)say
{
NSLog(@"category say");
}
@end