在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
/* 静态类型: 变量的类型在编译之时就被确定下来. 动态类型: 对象的类型由对象的内存里的某个结构数据来决定它是什么类型, 而不是在编译之时就被确定下来的数据类型。 对象的类型只有在运行时才知道。
oc中的所有对象都有一个共同的基类(根类):NSObject oc的动态类型特性完全由NSObject这个类来提供。
分析: NSObject类的一个成员变量: Class isa; 实际上是一个结构体指针类型 typedef struct objc_class * Class;
结构体如下: struct objc_class { Class isa; ? Class super_class; 指向父类的结构体 const char *name; 类名 long version; 版本 long info; 信息 long instance_size; 对象的内存大小 struct objc_ivar_list *ivars; 类的成员变量的列表 struct objc_method_list **methodLists; 类的方法列表 struct objc_cache *cache; //缓冲区 struct objc_protocol_list *protocols; //该类遵守的所有协议的列表 } ;
// SEL 数据类型: 就是oc对方法名的一个编码类型,可以理解成一个整数 // 如何将一个方法名编码? // 答: 用@selector(方法名)就可以生成一个SEL类型的值 //
// Class: 是一个结构体指针类型, // 所以isa是一个结构体的地址
// 如果要判断某个对象是否属于某个类,那么直接问这个对象的isa变量,是不是存的某个类的结构体的地址? [person class] ?= [Person class]
isKindOfClass: isMemberOfClass: class 类方法 class 对象方法 performSelector: performSelector: withObject: 还要理解: SEL数据类型 是对方法的一个编码,不必深纠这个编码的值 Class数据类型: struct objc_class* 还要掌握几个函数: NSClassFromString: 用处: 通过类名得到Class值 NSStringFromClass: 用处: 通过Class值得到类名 */ Person *person = [[ Person alloc]init];
SEL sel = @selector(sleeping);
if ([Person instancesRespondToSelector:sel]==YES) { NSLog(@"Person类的对象具有方法 sleeping"); [person sleeping]; } else NSLog(@"Person类的对象没有方法 sleeping");
if([person class] == [Person class]) { NSLog(@"你是大坏蛋嘛!"); }
// isKindOfClass: 是问某个对象是否是某个类的对象或某个类的子类的对象 if( YES==[person isKindOfClass:NSClassFromString(@"Person")]) { NSLog(@"person是Person类的对象"); }
Student * stu=[[Student alloc]init];
if (YES ==[stu isKindOfClass:NSClassFromString(@"Person")]) { NSLog(@"stu这个对象是Person类的对象或Person类的子类的对象"); }
if( YES==[person isMemberOfClass:NSClassFromString(@"Person")]) { NSLog(@"person这个对象是Person类的对象"); }
if (YES==[stu isMemberOfClass:NSClassFromString(@"Person")]) { NSLog(@"stu这个对象是Person类的对象"); } else { NSLog(@"stu这个对象不是Person类的对象"); }
// isMemberOfClass方法的内部就是如下: // if( [self class]==[Person class] ) // return YES; // return NO; //
[person performSelector:@selector(sleeping) withObject:nil]; [person performSelector:@selector(printObject:) withObject:@"Message"];
Class cls = NSClassFromString(@"Person"); NSString *classStr = NSStringFromClass([类名 Class]);// 由类名得到字符串 NSLog(@"通过Class得到的类名为:%@",NSStringFromClass(cls)); |
请发表评论