黑马程序员——OC基础---类的本质
------- android培训、ios培训、期待与您交流! ----------
内容概括:
1、深入介绍类的核心及本质。
2、类的调用、输出及SEL类型。
类的本质:
1、类本身也是个对象,是class类型的对象,简称类对象。
创建过程
1.class创建出person类对象。
2.再用person类对象创建person类的对象。
2、获取内存中的类对象方法,返回的class对象是同一个类。
1.class c = [p class];
2.class c2 = [p2 class];
3.class c3 = [person class];
3、设在person类中有一个test方法,可通过如下方法调用。
[person test]; // 直接调用
person *p = [ [person alloc] init]; // 创建一个类对象后再调用。
Class c = [p class]; // c就是类对象。
[c, test];
类的加载及输出:
1、类的加载:当程序启动时时候,就会加载一次项目中所有的类(也会加载分类),类加载完毕后就会调用+load方法,且只调用一次。
2、类的使用:当第一次调用这个类时,就会调用一次这个类的+initialize方法(如果有分类,优先调用分类的这个方法)。
3、加载顺序:先加载父类,再加载子类(先调用父类的load方法,再调用子类的load方法)。
注意:
1.+initialize 监听类什么时候被使用。
2.类名就代表类对象,每个类只有一个类对象。
类的输出:
可以用NSLog输出类的所有属性吗?那么又该怎样输出。
1、默认情况下,利用NSLog和%@输出对象时,结果是<类名:内存地址>。
2、使用NSLog时,即NSLog(@”%@”, p):
1.会调用对象平p的-description方法。
2.拿到 - description方法的返回值(NSString *)显示到屏幕上。
3.-description方法返回的是“类名 + 内存地址”,为了输出对象的所有属性,要重写 - description方法。
所以类的-description方法决定类对象的输出结果。
示例:
+ (NSString * ) description
{
Return @”abc”;
}
int main()
{
NSLog(@”%@”,Person); // 输出结果是abc。
}
SEL类型:(方法的包装数据类型)
1、方法都以SEL数据类型存储在类中。
int main()
Person *p = [ [Person alloc] init];
[p test2];
上述代码调用时,内部分为以下三步。
1.把text2包装成SEL类型的数据。
2.根据SEL数据找到方法地址。
3.根据方法地址调用对应的方法。
调用方法的另一种方式。
1、[p performselector : @ selector (test2: withObject :参数)];
2、每个方法都有一个与之对应的SEL数据。
3、根据一个SEL对象就可以找到方法的地址,进而调用方法。
*疑问:本节中方法名的书写
2、SEL对象的创建。
1> SEL s = @selector(test);
2> SEL s2 = NSSekctorFromstring(@“test”);
3> 每个方法内部都有一个SEL数据-cmd,它代表着当前方法。
示例:
#import "Person.h"
@implementation Person
- (void)test
{
// _cmd代表着当前方法
NSString *str = NSStringFromSelector(_cmd);
// 调用当前方法,会引发死循环。
// [self performSelector:_cmd];
NSLog(@"调用了test2方法-----%@", str);
}
- (void)test3:(NSString *)abc
{
NSLog(@"test3-----%@", abc);
}
@end

481

被折叠的 条评论
为什么被折叠?



