您的位置:首页 > 编程语言 > C语言/C++

黑马程序员 -- OC语言 Category 类深入 描述

2015-04-01 15:58 281 查看
------- android培训、.Net培训、IOS培训碧空海的技术博客,期待与您交流!----------

第四讲 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)];

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息