oc基础知识

                    基础知识(分类)

分类(categroy)

分类的作用:

       在不改变原来类模型的基础上,给某个类扩充一些方法。( 不修改原来代码)

分类格式:

       声明:@interface 类名 (分类名称)

                   一个类可以拥有很多分类,在分类名称中区别。

                  @end

        实现:@implementation 类名 (分类名称)

                   @end

把不同功能的方法 ,写到不同的分类里面,一个分类写一中功能。

 

分类名称一般以模块命名,不是以作者命名。

 

分类的使用注意:

1,分类只能增加方法,不能扩充成员变量。

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

3,分类可以重新实现原来类中的方法,但是会覆盖原来的方法,导致原来的方法失效,原来方法无法使用。

4,分类的优先级:调用方法先去分类中找,然后去原来的类中找,没有再去父类中找。一级一级往上找。

5,最后参与编译的分类优先,看编译的顺序,最后编译的文件会覆盖前面编译文件。

 

分类的应用:(用在系统自带的类上面)

给系统自带的NSString 添加一个类方法:

计算某个字符串中阿拉伯数字的个数?

一般把分类的作用当做分类的名称

题目意思 @“agfdsfsdf123344566sfsdf" 计算数字的个数

要求:给NSString增加一个类方法。

@interface NSString(number)

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

@implementation NSString(number)

+ (int)numberCountOfString:(NSString *) str

int count = 0;

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

{

 uni char c = [str characterAtTndex: i];

   if(c >= "0" && c <= "9")

   {

       count++;

   }

}

retrun count;              在类方法中调用对象方法:return [str numberCount]; 一个方法解决两个方法。 

}

int main()

{

        int count = [NSString  numberCountOfSting:@"afsfsfsdf131313sfsf"]

        NSLog(@“%d.count”);

 

}

 

同样的题目,给NSString增加一个对象方法。

声明:- (int) numberCount; 对象方法不屑谁的,他自己的,后边也没有谁的字符串。

实现:

- (int)numberCount

{

int count = 0;

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

{

unichar c = [self characterAtTndex:i];

if (c>="0" &&c<="9")

{

count++;

}

return count;

}

}

int main()

{

int count = [@"sfsfsfs1313f13s1g3ssf",numberCount];

NSLog(@"%d\n",count);

}

 

类的深入研究 (类也是一个对象)

类的本质也是一个对象是class的对象

一个类在内存中,只有一块储存空间,这块储存空间称之为类对象。

class类型对象 创建对应类型的另一种 类对象,利用类对象创建出这个类。  类与类对象是等价的。

 

获取类对象的两种方式:

类方法:class c = [person class]l

             

对象方法: Person *p = [Person new]

            class c2 = [p class]

 

拿到类对象有什么作用:

[p class] 获取到了内存中的类对象,有了类对象就能调用类方法。[c class];

 

类对象的使用:

每次创建对象首先都会把类对象创建好,加载内存,在利用类对象创建某一个类型的对象。

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

class c = [p class];

利用Person类型,对象p的class方法,能获取我们这个类对象

指针c 就是获取的内存中的类对象。

 

还可以这样创建对象:

Person *p2 =[(c new) init] =[(person new) init];

 

类的加载过程:

当程序已启动是会把所有的类搞进来加载一次,先加载父类在加载子类。

 

怎样验证是否加载了:

只要加载了这个类,就会调用类的一个 + Load方法,是个类方法,比较深层的一个方法。

只要这个类加载完毕后,系统会自动调用 +Load方法,而且类只会被加载一次。

+ (void)load

{

     NSLog(@"我被调用了");

}

 

main函数虽然没有用到这个类,但类的有些东西还是会被加载。做一个简单的加载。

 

我想知道你有没有使用者个类,用+Load方法,因为只要在调用这个类,就会先加载,只要加载系统就会自动调用+Load方法 监听这个类的加载过程。

比如:

int main()

{

  [[student alloc] init];

}

调用student 这个类时 会进一步的加载,加载完了,会调用另一个方法叫initlalize方法 。

+(void)initlalize

{

   Nsl(@"student --initlalize");

}

当程序一启动时,就会加载一次项目中所有的类和分类,这个类加载完毕后就会调用+Load方法。只会加载一次。

当第一次使用这个类的时候,就会调用一次initlalize方法,而且,不管你是load还是initlalize都是先搞父类在到子类。

initlalize用到这个类调用的,用不到不调用。

 

分类也要加载 + load方法 不用也不用加载。

+initlalize方法会选择调用分类,不调用本类的+initlalize.如果分类没有 ,就去本类中找,本类中在没有去父类中找。

层层往上。

initlalize是初始化的意思。

 

重写这个类的initialize方法, 在+(void)initialize里面写上我们第一次使用类时想做的事情。利用这个方法可以监听这个类在什么时候可以被使用,这就是所谓的监听。

类第一次调用+initialize方法,监听类的初始化过程,知道类在什么时候被使用。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值