黑马程序员——OC中的类
来源:互联网 发布:卖家怎么玩好淘宝客 编辑:程序博客网 时间:2024/05/21 20:02
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一、类的本质
类本身也是一个对象,是class类型的对象,简称“类对象”。Class类型的定义:
Typedef struct obj class *class;
类名就代表着类对象,每个类只有一个类对象。
获取内存中的类对象有两种方法:
(1)class c=[p class];//指向类的对象的指针调用class方法
(2)class c1=[Person class];//使用类名调用class方法
- //头文件
- #import<Foundation/Foundation.h>
- #import "class1.h"
- int main() //函数入口点
- {
- //创建一个person对象
- Person *p=[[Person alloc] init];
- //调用p的class方法
- class c1=[p class];
- //调用类class1 的class方法
- class c2=[class1 class];
- //打印三者地址值
- NSLog(@"\n%p\n%p\n%p",p,c1,c2);
- return 0;
- }
二、类的加载
- //Person类的实现
- #import "Person.h"
- @implementation Person
- //重写load方法
- + (void)load
- {
- NSLog(@"class --load");
- }
- //重写initialize方法
- + (void)initialize
- {
- NSLog(@"class ---initialize");
- }
- @end
- #import <Foundation/Foundation.h>
- #import "Person.h"
- int main()
- {
- return 0;
- }
由上我们可以看出,程序运行时会加载类的load方法.
当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法,只会调用一次;
三、类的初始化
- #import <Foundation/Foundation.h>
- #import "Person.h"
- int main() //入口点
- {
- //创建一个Person类
- Person *p= [[Person alloc]init];
- return 0;
- }
对比我们可以知道,当程序运行时会加载load方法,当使用时会加载initialize方法.
当第一次使用某个类时,就会调用当前类的+initialize方法;
先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法,最后调用分类的+load方法),先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法)。
注意:在初始化的时候,如果在分类中重写了+initialize方法,则会覆盖掉父类的。
重写+initialize方法可以监听类的使用情况。
先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法,最后调用分类的+load方法),先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法)。
注意:在初始化的时候,如果在分类中重写了+initialize方法,则会覆盖掉父类的。
重写+initialize方法可以监听类的使用情况。
四、description方法
-description方法
使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出.
- #import <Foundation/Foundation.h>
- #import "Person.h"
- int main()
- {
- Person *p1=[[Person alloc]init];
- //以%@输出p1
- NSLog(@"%@",p1);
- return 0;
- }
- //输出结果
- faceOfClass[29629:110095] <Person: 0x10030e270>
- #import "Person.h"
- @implementation Person
- //重写description方法
- - (NSString *)description
- {
- NSLog(@"调用了description方法");
- return @"just test";
- }
- @end
由此我们可以看出
使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出.
五、SEL每个类的方法列表都存储在类对象中,每个方法都有一个与之对应的SEL类型的对象,根据一个SEL对象就可以找到方法的地址,进而调用方法.
SEL类型的定义
typedef struct objc_selector *SEL;
SEL类型的定义
typedef struct objc_selector *SEL;
SEL对象创建
1.SEL s = @selector(test);
2.SEL s2 = NSSelectorFromString(@"test");
2.SEL s2 = NSSelectorFromString(@"test");
SEL对象的其它用法
- // 将SEL对象转为NSString对象
- NSString *str = NSStringFromSelector(@selector(test));
- //练习
- SEL s1=@selector(test);
- NSLog(@"%@",NSStringFromSelector(s1));
- //输出结果为test
- Person *p = [Person new];
- // 调用对象p的test方法
- [p performSelector:@selector(test)
0 0
- 黑马程序员——OC中的类
- 黑马程序员——OC中的类
- 黑马程序员——OC中的类
- 黑马程序员——oc中的方法
- 黑马程序员——OC中的封装
- 黑马程序员——OC中的copy
- 黑马程序员——OC中的分类
- 黑马程序员——OC中的Foundation
- 黑马程序员——OC语言中的类和对象
- 黑马程序员-OC中的类
- 黑马程序员 --- OC中的类
- 黑马程序员——OC—OC中的面向对象
- 黑马程序员--OC--OC中的类
- 黑马程序员——oc类实例
- 黑马程序员——OC类方法
- ——黑马程序员——OC中的继承
- ——黑马程序员——OC中的基本概念
- ——黑马程序员——OC中的多态
- 黑马程序员——OC中的核心语法
- 黑马程序员——C语言中的结构体
- 黑马程序员——面向对象的三大特性
- 黑马程序员——C语言中的指针
- 黑马程序员——C语言中的数组
- 黑马程序员——OC中的类
- 黑马程序员——C语言中的预处理指令
- 黑马程序员——OC中的内存管理
- 成功解决2011款mac pro显卡门导致的MAC 花屏或 蓝屏 或 白屏
- Oracle Flashback技术之Flashback Query
- 黑马程序员——OC中的分类
- 黑马程序员——OC中的Foundation
- Windows Server部署PHP+MYSQL运行环境
- [LeetCode 253] Meeting Rooms II