黑马程序员——OC中的类
2015-10-12 07:15
316 查看
------<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方法
[objc] view
plaincopy
//头文件
#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;
}
二、类的加载
[objc] view
plaincopy
//Person类的实现
#import "Person.h"
@implementation Person
//重写load方法
+ (void)load
{
NSLog(@"class --load");
}
//重写initialize方法
+ (void)initialize
{
NSLog(@"class ---initialize");
}
@end
[objc] view
plaincopy
#import <Foundation/Foundation.h>
#import "Person.h"
int main()
{
return 0;
}
由上我们可以看出,程序运行时会加载类的load方法.
当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法,只会调用一次;
三、类的初始化
[objc] view
plaincopy
#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方法可以监听类的使用情况。
四、description方法
-description方法
使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出.
[objc] view
plaincopy
#import <Foundation/Foundation.h>
#import "Person.h"
int main()
{
Person *p1=[[Person alloc]init];
//以%@输出p1
NSLog(@"%@",p1);
return 0;
}
//输出结果
faceOfClass[29629:110095] <Person: 0x10030e270>
重写-description
[objc] view
plaincopy
#import "Person.h"
@implementation Person
//重写description方法
- (NSString *)description
{
NSLog(@"调用了description方法");
return @"just test";
}
@end
由此我们可以看出
使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出.
五、SEL
SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法,其实消息就是SEL.
每个类的方法列表都存储在类对象中,每个方法都有一个与之对应的SEL类型的对象,根据一个SEL对象就可以找到方法的地址,进而调用方法.
SEL类型的定义
typedef struct objc_selector *SEL;
SEL对象创建
1.SEL s = @selector(test);
2.SEL s2 = NSSelectorFromString(@"test");
SEL对象的其它用法
[objc] view
plaincopy
// 将SEL对象转为NSString对象
NSString *str = NSStringFromSelector(@selector(test));
//练习
SEL s1=@selector(test);
NSLog(@"%@",NSStringFromSelector(s1));
//输出结果为test
SEL的使用
[objc] view
plaincopy
Person *p = [Person new];
// 调用对象p的test方法
[p performSelector:@selector(test)
相关文章推荐
- 黑马程序员——面向对象的三大特性
- 黑马程序员——OC中的核心语法
- 黑马程序员-------Block
- 不想当一辈子码农,这有份IT民工进阶手册
- 程序员常去的6个头条分享站点
- 蜂窝教育软件工程师培训
- 山东润达软件:优秀程序员的18大法则
- 黑马程序员——Foundation---NSMutableArray
- java 面试题三十二 mysql查询面试题
- 黑马程序员——面向对象
- 《剑指Offer》面试题:平衡二叉树
- 面试题32:从1到n整数中1出现的次数
- 黑马程序员——JavaSE之对单例枚举和反射的看法一
- 今天面试了两个程序猿(二)
- 也许每个农村出来的码农都有个田园梦
- [京东 + 华为面试 + 金山笔试]自己总结
- 面试,一点小心得
- 从Lumia退役看为什么WP走向没落(从程序员与市场开发的角度,讲的真棒!)
- 黑马程序员——JavaSE之多线程中关于锁的理解 二
- 黑马程序员——OC中的协议:protocol