黑马程序员 -- OC语言 Category 类深入 描述
2015-04-01 15:58
281 查看
------- android培训、.Net培训、IOS培训、碧空海的技术博客,期待与您交流!----------
在Xcode中编译,编译器会自动建立.m和.h文件,并且在.m中是类的实现如下;
@implemention 类名
各种方法的实现,,,,,,
例如;
对象方法
- (void)test;
{
//实现的语句;
}
//类方法
+ (void)test;
{
//实现的语句;
}
@end
并且在.h中是类的声明如下;
@interface 类名 :NSObject (:NSObject表示:当前类继承于NSObject类)
{
//在这里进行成员变量的声明;
}
//在这里进行各种方法的声明;
//例如;
//对象方法
- (void)test;
//类方法
+ (void)test;
@end
B.分类:可以给某一个类扩充一下方法(在不修改原来类的代码)
//声明,是放在.h文件中的
@interface 类名(分类名称)
@end
//实现,是放在.m文件中的
@implemention 类名 (分类名称)
@end
在Xcode编译器中这样选择
第一框写入创建的分类的名字
第二框写入创建的分类来自于哪个类
创建完成后的实现效果。在这种情况下,原有类还是存在的
C.在分类中创建方法,就可以进行调用了
@interface Person (MJ)
- (void)study;
@end
@implemention Person (MJ)
- (void)study
{
NSLog(@”jjjjjjjjjjjjjjjjjjjjj”);
}
@end
接下来在主函数文件中,包含对应头文件(.h文件),就可以进行调用了如图;
分类的作用,在不改变原来类内容的基础上,可以为类增加方法。
1、分类自能增加方法,不能增加成员变量
2、分类的优先级最高。不建议分类中新建的方法名和原类相同。
3、方法的查找是按照::优先去分类中查找,然后再去原来类中找,最后再去父类中找。
4、在文件的编译列表中,不用去管他的顺序。然而在主函数文件夹中声明中头文件顺序要对,.h文件(头文件)相对应与应.m文件,总结来说需要编译的也就是.m文件(源代码文件)
D.给系统自带的类,建立自己的分类
给NSString类增加一个自己的类,计算字符串中数字个数。
@interface NSString (Number)
+ (int)numberCountOfString:(NSString *)str;
@end
@implemention NSString (Number)
+ (int)numberCountOfString:(NSString *)str
{
Int count = 0;
//Unichar c = [str characterAtIndex: 0]; //characterAtIndex: (NSUInteger);这个方法从str字符串//拿出对应(NSUInteger)的字符。
For (int i = 0;I < str.length; i++ )
{
Unichar c = [str characterAtIndex: i];
If ( c >= ‘0’ && c<= ‘9’) //c是字符,那么对应于也和字符比较’0’ ‘1’‘2’,,,,,,,,,,,,,,,,’9’
{
Count++;
}
Return count;
}
}
接下来在主函数中包含对应的.h文件,就可以调用此方法了。
接下来再用对象方法试试。
-(int)numberCount; //声明
-(int)numberCount //实现
{
For (int I = 0;I < self.Length; i++)
{
Unichar c = [self characterAtIndex:i] //取出i对应位置的字符
//如果是数字,count加1
If ( c >= ‘0’ && c<= ‘9’) //c是字符,那么对应于也和字符比较’0’ ‘1’‘2’,,,,,,,,,,,,,,,,’9’
{
Count++;
}
Return count;
}
}
Command /:快捷键用于注释
实际实现截图为
E. OC类的本质
//利用Person这个类创建了2个Person类型的对象。任何类使用必定先加载,每个类仅仅有一份存储空间。
Person *p = [ [Person alloc] init];
Person *p2 = [ [Person alloc] init];
Person *p3 = [ [Person alloc] init];
类对象分配框图分析;
每个对象的类,都是同一个。
创建的类打印后,显示的地址是相同的。
注解:
在实现中。
+(void)test
{
}
在这里定义的类方法。Class c = [p class];内存中的的类的对象。类对象 = 类。
Class c =[p class];
[c test];
Person*p2 = [ [c new] init];
NSLog(@”@@@@@@@@@@@@’); 结果如下;
F.类的加载和初始化
1、类的加载过程,先加在父类,在加载子类。类加载的时候会调用Load方法,在类被加载的时候调用。这个类即使没有使用也是执行Load类的。
4000
+(void)load
{
NSLog(@”@@@@@@”);
}
2、监听什么时候加载某类
+ (void)initialize
{
NSLog(@”############”);
}
G.description方法
1、打印对象用%@,1.NSLog首先会调用对象的-description方法,2.返回值为(NSString *),并显示在屏幕上。
默认情况下,利用NSLog和%@输出地对象时,结果是:<类名: 内存地址>。效果如下;
打印所有属性的对象。只能用重写的方法实现。(方法中优先选择当前类)
使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出显示到屏幕上。
决定了实例对象的输出结果
-(NSString *)description
{
Return [NSString stringWithFormat:@”age =%d name = %@”, -age, -name];//字符串拼接打印,可以实现整体打印。
//Return @”456123”;
}
里面加入NSLog(@”%@”, self);时,self会执行最近的方法,继而引发死循环。
使用NSLog和%@输出某个类对象时,会调用类对象的+description方法,并拿到返回值进行输出到屏幕上。
//决定了类对象的输出结果
+(NSString *)description
{
}
+description类方法默认返回类名。
NSLog的另外使用输出;
H.sel类型应用
1、sel类型数据,就代表一种方法。
创建类对象的时候,就分配了一定的存储空间。并且空间中包含了类内部的方法和成员变量。
同时内部的isa指针指向当前类的地址。每个sel数据对应一个方法。
2、方法的存储位置
每个类的方法列表都存储在类对象中。每个方法都有一个与之对应的SEL类型的对象。
根据一个SEL对象就可以找到方法的地址,进而调用方法。
SEL类型的定义
typedefstructobjc_selector *SEL;
SEL对象的创建
SEL s = @selector(test);
SEL s2 = NSSelectorFromString(@"test");
SEL对象的其他用法
// 将SEL对象转为NSString对象
NSString *str =NSStringFromSelector(@selector(test));
Person *p = [Personnew];
// 调用对象p的test方法
[p performSelector:@selector(test)];
第四讲 Category 类深入 描述
A.Category分类的使用方法;在Xcode中编译,编译器会自动建立.m和.h文件,并且在.m中是类的实现如下;
@implemention 类名
各种方法的实现,,,,,,
例如;
对象方法
- (void)test;
{
//实现的语句;
}
//类方法
+ (void)test;
{
//实现的语句;
}
@end
并且在.h中是类的声明如下;
@interface 类名 :NSObject (:NSObject表示:当前类继承于NSObject类)
{
//在这里进行成员变量的声明;
}
//在这里进行各种方法的声明;
//例如;
//对象方法
- (void)test;
//类方法
+ (void)test;
@end
B.分类:可以给某一个类扩充一下方法(在不修改原来类的代码)
//声明,是放在.h文件中的
@interface 类名(分类名称)
@end
//实现,是放在.m文件中的
@implemention 类名 (分类名称)
@end
在Xcode编译器中这样选择
第一框写入创建的分类的名字
第二框写入创建的分类来自于哪个类
创建完成后的实现效果。在这种情况下,原有类还是存在的
C.在分类中创建方法,就可以进行调用了
@interface Person (MJ)
- (void)study;
@end
@implemention Person (MJ)
- (void)study
{
NSLog(@”jjjjjjjjjjjjjjjjjjjjj”);
}
@end
接下来在主函数文件中,包含对应头文件(.h文件),就可以进行调用了如图;
分类的作用,在不改变原来类内容的基础上,可以为类增加方法。
1、分类自能增加方法,不能增加成员变量
2、分类的优先级最高。不建议分类中新建的方法名和原类相同。
3、方法的查找是按照::优先去分类中查找,然后再去原来类中找,最后再去父类中找。
4、在文件的编译列表中,不用去管他的顺序。然而在主函数文件夹中声明中头文件顺序要对,.h文件(头文件)相对应与应.m文件,总结来说需要编译的也就是.m文件(源代码文件)
D.给系统自带的类,建立自己的分类
给NSString类增加一个自己的类,计算字符串中数字个数。
@interface NSString (Number)
+ (int)numberCountOfString:(NSString *)str;
@end
@implemention NSString (Number)
+ (int)numberCountOfString:(NSString *)str
{
Int count = 0;
//Unichar c = [str characterAtIndex: 0]; //characterAtIndex: (NSUInteger);这个方法从str字符串//拿出对应(NSUInteger)的字符。
For (int i = 0;I < str.length; i++ )
{
Unichar c = [str characterAtIndex: i];
If ( c >= ‘0’ && c<= ‘9’) //c是字符,那么对应于也和字符比较’0’ ‘1’‘2’,,,,,,,,,,,,,,,,’9’
{
Count++;
}
Return count;
}
}
接下来在主函数中包含对应的.h文件,就可以调用此方法了。
接下来再用对象方法试试。
-(int)numberCount; //声明
-(int)numberCount //实现
{
For (int I = 0;I < self.Length; i++)
{
Unichar c = [self characterAtIndex:i] //取出i对应位置的字符
//如果是数字,count加1
If ( c >= ‘0’ && c<= ‘9’) //c是字符,那么对应于也和字符比较’0’ ‘1’‘2’,,,,,,,,,,,,,,,,’9’
{
Count++;
}
Return count;
}
}
Command /:快捷键用于注释
实际实现截图为
E. OC类的本质
//利用Person这个类创建了2个Person类型的对象。任何类使用必定先加载,每个类仅仅有一份存储空间。
Person *p = [ [Person alloc] init];
Person *p2 = [ [Person alloc] init];
Person *p3 = [ [Person alloc] init];
类对象分配框图分析;
每个对象的类,都是同一个。
创建的类打印后,显示的地址是相同的。
注解:
在实现中。
+(void)test
{
}
在这里定义的类方法。Class c = [p class];内存中的的类的对象。类对象 = 类。
Class c =[p class];
[c test];
Person*p2 = [ [c new] init];
NSLog(@”@@@@@@@@@@@@’); 结果如下;
F.类的加载和初始化
1、类的加载过程,先加在父类,在加载子类。类加载的时候会调用Load方法,在类被加载的时候调用。这个类即使没有使用也是执行Load类的。
4000
+(void)load
{
NSLog(@”@@@@@@”);
}
2、监听什么时候加载某类
+ (void)initialize
{
NSLog(@”############”);
}
G.description方法
1、打印对象用%@,1.NSLog首先会调用对象的-description方法,2.返回值为(NSString *),并显示在屏幕上。
默认情况下,利用NSLog和%@输出地对象时,结果是:<类名: 内存地址>。效果如下;
打印所有属性的对象。只能用重写的方法实现。(方法中优先选择当前类)
使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出显示到屏幕上。
决定了实例对象的输出结果
-(NSString *)description
{
Return [NSString stringWithFormat:@”age =%d name = %@”, -age, -name];//字符串拼接打印,可以实现整体打印。
//Return @”456123”;
}
里面加入NSLog(@”%@”, self);时,self会执行最近的方法,继而引发死循环。
使用NSLog和%@输出某个类对象时,会调用类对象的+description方法,并拿到返回值进行输出到屏幕上。
//决定了类对象的输出结果
+(NSString *)description
{
}
+description类方法默认返回类名。
NSLog的另外使用输出;
H.sel类型应用
1、sel类型数据,就代表一种方法。
创建类对象的时候,就分配了一定的存储空间。并且空间中包含了类内部的方法和成员变量。
同时内部的isa指针指向当前类的地址。每个sel数据对应一个方法。
2、方法的存储位置
每个类的方法列表都存储在类对象中。每个方法都有一个与之对应的SEL类型的对象。
根据一个SEL对象就可以找到方法的地址,进而调用方法。
SEL类型的定义
typedefstructobjc_selector *SEL;
SEL对象的创建
SEL s = @selector(test);
SEL s2 = NSSelectorFromString(@"test");
SEL对象的其他用法
// 将SEL对象转为NSString对象
NSString *str =NSStringFromSelector(@selector(test));
Person *p = [Personnew];
// 调用对象p的test方法
[p performSelector:@selector(test)];
相关文章推荐
- 黑马程序员——OC语言学习——关键字id、构造方法、Category-分类、类的本质、 description方法、 SEL方法
- 黑马程序员13——OC语言之Category
- 黑马程序员 - OC语言 - 【考点】分类(Category)使用注意事项
- 黑马程序员——OC语言------NSString、多文件开发、点语法、成员变量的作用域、@property和@synthesize
- 黑马程序员—OC语言基础—基础语法知识
- 黑马程序员_OC基础02_分类(Category)
- 黑马程序员 -- OC语言 封装 继承 多态
- 黑马程序员 -- OC语言 NSString使用 点语法 构造 分类
- 黑马程序员---【OC语言】05点语法与作用域
- 黑马程序员——OC语言基础---extern和static关键字
- 黑马程序员-OC语言之继承
- 黑马程序员之ios学习总结——10 OC语言的构造方法和分类
- 黑马程序员_OC中的分类(Category)的使用
- 【黑马程序员】【OC语言】self关键字
- 黑马程序员—— OC加强---ARC+Category+Block
- 黑马程序员——9、OC语言(内存管理和ARC)
- 黑马程序员_OC语言之类方法和关键字self
- 黑马程序员_OC语言之面向对象的三大特性(封装、继承、多态)
- 黑马程序员——OC语言日志——NSArray的介绍和使用
- 黑马程序员——OC语言日志——NSMutableString和NSMutableArray 的介绍及使用