lijifeng

导航

黑马程序员——OC语言 核心语法 (3)

                                                          (以下内容是对黑马苹果入学视频的个人知识点总结)

(一)分类Category

1) 基本用途

  如何在不改变原来类模型的前提下,给类扩充一些方法,分类(Category)

2)格式

1>分类的声明

@interface 类名 (分类名称)

// 方法声明

@end

2>分类的实现

@implementation 类名 (分类名称)

// 方法实现

@end

 1 @implementation Person (JJ)
 2 - (void)test2
 3 {
 4     NSLog(@"-----test2");
 5 }
 6 
 7 - (void)test
 8 {
 9     NSLog(@"Person (JJ)-test");
10 }
11 @end

分类好处

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

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

使用注意:

 1>分类只能增加方法,不能增加成员变量

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

 3>分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用

 4>方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类  --> 父类

(二)类的本质

1 )类也是个对象

1>其实类也是一个对象,是Class类型的对象,简称“类对象”

2>Class类型的定义

1 typedef struct objc_class *Class;

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

2)+load和+initialize

+load

1> 在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法

2> 先加载父类,再加载子类;也就是先调用父类的+load,再调用子类的+load

3> 先加载元原始类,再加载分类

4> 不管程序运行过程有没有用到这个类,都会调用+load加载

+initialize

1>在第一次使用某个类时(比如创建对象等),就会调用一次+initialize方法

2>一个类只会调用一次+initialize方法,先调用父类的,再调用子类的

(三)description的方法

-description方法

使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出

+ description方法

1 + (NSString *)description
2 {
3     return @"Abc";
4 }

使用NSLog和%@输出某个类对象时,会调用类对象+description方法,并拿到返回值进行输出

修改NSLog的默认输出

重写-description或者+description方法即可

死循环陷阱

如果在-description方法中使用NSLog打印self

1 - (NSString *)description
2 {
3    // 下面代码会引发死循环
4     NSLog(@"%@", self);
5    return [NSString stringWithFormat:@"age=%d, name=%@", _age, _name];
6    //return @"3424324";
7 }

 

(四)SEL

1)方法的存储位置

1>每个类的方法列表都存储在类对象中

2>每个方法都有一个与之对应的SEL类型的对象

3>根据一个SEL对象就可以找到方法的地址,进而调用方法

4>SEL类型的定义

1 typedef struct objc_selector    *SEL;

2)SEL对象的创建

1 SEL s = @selector(test);
2 SEL s2 = NSSelectorFromString(@"test");

3)SEL对象的其余用法

1 // 将SEL对象转为NSString对象
2 NSString *str = NSStringFromSelector(@selector(test));
3 
4 Person *p = [Person new];
5 // 调用对象p的test方法
6 [p performSelector:@selector(test)];

 

posted on 2015-03-23 18:21  lijifeng  阅读(131)  评论(0编辑  收藏  举报