黑马程序员----objective-C 分类介绍

来源:互联网 发布:多用户 分销 源码 编辑:程序博客网 时间:2024/06/11 14:20

-------android培训、java培训、IOS培训、期待与您交流!-------

Category分类,类别,类目

//可以给某一个类扩充一些方法(不修改原来类的代码)

基本形式

//声明

@interface 类名(分类名称)

@end

//实现

@implementation 类名(分类名称)

@end

 

代码示例:

//不用继承,不改动Person类的情况下给Person增加一些方法

/*

分类的作用:在不改变原来内容的基础上。可以为类增加一些方法,

分类使用注意:

1,只能增加方法,不能增加成员变量,如果想添加变量,可以考虑通过继承创建子类

2,分类方法实现中可以访问原来类中声明的成员变量

3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法无法使用。不建议重写方法

4,方法调用的优先级:分类(最后参与编译的分类优先)--》原来类---》父类,多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效

5.在很多的情况下,往往是给系统自带的类添加分类,如NSObject和NSString,因为有的时候,系统类可能并不能满足我们的要求。

6.在大规模的应用中,通常把相应的功能写成一个分类,可以有无限个分类,对原有类进行扩充,一般分模块写,一个模块一个分类。

 

分类好处

一个庞大的类可以分模块开发

一个庞大的类可以由多个人来编写,更有利于团队合作

*/

@interface Person :NSObject

- (void)test;

@end

 

@implementation Person

- (void)test

{

   NSLog(@"---");

}

@end

 

@interface Person (MJ)

- (void)study;

@end

 

#import "Person+MJ.h"

@implementation Person (MJ)

- (void)study

{

    NSLog(@"学习-----%d", _age);

}

 

- (void)test

{

    NSLog(@"Person (MJ)-test");

}

@end

 

#import "Person+JJ.h"

 

@implementation Person (JJ)

- (void)test2

{

    NSLog(@"-----test2");

}

 

- (void)test

{

    NSLog(@"Person (JJ)-test");

}

@end

 

int main()

{

   Person *p = [[Person alloc] init];

       [p test];

  

   [p test2];

   p.age = 10;//

       [p study];

    // 优先去分类中查找,然后再去原来类中找,最后再去父类中找

   

    return 0;

}

 

Category的练习

/*

给NSString增加一个类方法:计算字符串中阿拉伯数字的个数

给NSString增加一个对象方法:计算字符串中阿拉伯数字的个数

*/

#import <Foundation/Foundatition.h>

@interface NSString (Number)

+ (int)numberCountOfString:(NSString *)str;

 

- (int)numberCount;

@end

 

//@"adfasd1334zd"

@implemetation NSString (Number)

+ (int)numberCountOfString:(NSString *)str

{

   //1.定义变量计算数字的个数

   int count = 0;

  

   for(int i = 0;i<str.length; i++)

   {

       unichar c = [str characterAtIndex:0];

//uichar就是 unsign char,characterAtIndex是NSString自带方法传递一个int类型参数.代表传递

字符串第参数个字符

       if ( c>='0'&& c<= '9') //if (c>=48&& c<= 57)

       {

          count++;

       }

   }

   return count;

 

   return [str numberCount];

}

- (int)numberCount

{

   int count = 0;

   for (int i = 0;i<self.length;i++)

   {

       unichar c = [self characterAtIndex:i];

       if ( c>='0'&& c<= '9') //if (c>=48&& c<= 57)

       {

          count++;

       }  

   }

   return count;

}

@end

int main()

// 类库 : 很多类的集合

{

   int count = [NSString NumberCountOfString:@"sdf4546dfett"];

   int count2 = [@"5sadf65dfeyh",count];

   NSLog(@"%d,%d",count,count2 );

}

 

类的深入研究

(一)类的本质

类本身也是一个对象,是class类型的对象,简称“类对象”

Class类型的定义:

Typedef struct obj class *class;

类名就代表着类对象,每个类只有一个类对象。

利用class 创建 Person类

利用Person 创建Person类型的对象

Person *p=[[Person alloc] init];

 

获取内存中的类对象有两种方法:

(1)Person *p=[[Person alloc] init];

class c=[p claas];//指向类的对象的指针调用class方法,对象方法

(2)Class c1=[Person class];//使用类名调用class方法类方法

注意:c和c1打印出来的地址相同,class c2=[p claa];可以证明所有的对象共用一个类方法。

 

(二)类的加载和初始化

//当程序启动的时候,就会加载一次项目中所有的类。类加载完毕后就会调用+load方法

+ (void)load

{

    NSLog(@"Person---load");

}

//当第一次使用这个类的时候,就会调用一次+initialize方法

+ (void)initialize

{

    NSLog(@"Person-initialize");

}

@end

 

@implementation Student

//在类被加载的时候调用,重写方法

+ (void)load

{

    NSLog(@"Student---load");

}

 

+ (void)initialize

{

    NSLog(@"Student +initialize");

}

 

/*

 1.当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法。只会调用一次。

 2.当第一次使用某个类时,就会调用当前类的+initialize方法

 3.先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法)

 4.先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法).注意:在初始化的时候,如果在分类中重写了+initialize方法,则会覆盖掉父类的。

 5.重写+initialize方法可以监听类的使用情况。

 */

int main()

{

Person *p = [[Person alloc] init];

    // [[GoodStudent alloc] init];

    Person *p1 = [[Person alloc] init];

    return 0;

}

0 0
原创粉丝点击