黑马程序员——类的本质

来源:互联网 发布:linux退出vi模式 编辑:程序博客网 时间:2024/04/30 07:45

黑马程序员——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对象就可以找到方法的地址,进而调用方法。

*疑问:本节中方法名的书写

2SEL对象的创建。

1> SEL s = @selectortest);

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


 

0 0