2016年8月16日星期二17:26
Catgory 分类
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Person+Play.h"
int main(int argc, const char * argv[]) {
@autoreleasepool{
/*
分类的声明
@interface ClassName(CatgoryName)
NewMethod;在类别中添加方法
不允许在类别中添加变量
@end
@implementation ClassName(CatgoryName)
NewMethod
@end
ClassName:需要给哪个类扩充方法
CategoryName:分类的名称
NewMethod:扩充的方法
*/
Person *p = [[Person alloc]init];
p.age = 23;
[p playground];
}
return 0;
}
分类注意点
1.分类是用于给原有类添加方法的,它只能添加方法,不能添加属性(成员变量)
2.分类中的@property,只会生成setter/getter方法的声明,不会生成实现以及私有的成员变量
3.可以在分类中访问原有类中.h的属性
4.如果分类中有和原有类同名的方法,会调用分类中的方法
5.如果多个分类中都有和原有类中同名的方法,那么调用该方法的由编译器决定
练习
#import <Foundation/Foundation.h>
#import "NSString+XC.h"
int main(int argc, const char * argv[]) {
@autoreleasepool{
NSString *str = @"asdas123456789";
int count = [str count];
NSLog(@"count = %i",count);
}
NSString *str1 = @"asdas123456789";
int count1 = [NSString countWithStr:str1];
NSLog(@"count = %i",count1);
return 0;
}
#import <Foundation/Foundation.h>
@interface NSString
(XC)
+(int)countWithStr:(NSString*)str;
-(int)count;
@end
#import "NSString+XC.h"
@implementation
NSString (XC)
+(int)countWithStr:(NSString*)str
{
intcount = 0;
for(inti = 0; i<str.length; ++i) {
//取出字符串中的数字索引
unichar c = [str
characterAtIndex:i];
if (c >= '0' && c <='9') {
count++;
}
}
returncount;
}
-(int)count
{
intcount = 0;
//在这个方法里self代表的是谁调用了这个方法,在main里用调用的str所以self就代表str
for(inti = 0; i<self.length; ++i) {
unichar c = [self characterAtIndex:i];
if (c >= '0' && c <='9') {
count++;
}
}
returncount;
}
@end