/*

静态类型:

变量的类型在编译之时就被确定下来.

动态类型:

对象的类型由对象的内存里的某个结构数据来决定它是什么类型,

而不是在编译之时就被确定下来的数据类型。

对象的类型只有在运行时才知道。

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));

最新文章

  1. In-Memory:在内存中创建临时表和表变量
  2. C# 软件绑定QQ群类开源放出
  3. Makefile-2
  4. Scrum项目3.0
  5. Sublime发布Markdown博客
  6. 流程控制语句和增强for循环
  7. 让QT编译快一点(增加基础头文件)
  8. [LeetCode OJ] Max Points on a Line—Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
  9. 习题二:string数组应用
  10. 如何运用xp_cmdshell 执行多行cmd命令
  11. Java Excel 合并单元格
  12. Mysql数据库主从配置
  13. c# 复制dataset中table结构跟数据
  14. 628. Maximum Product of Three Numbers
  15. spark shuffle
  16. 关于Linux虚拟化技术KVM的科普 科普五(From 世民谈云计算)
  17. (转)理解CPU steal time
  18. Jmeter-JDBC Request参数化
  19. Python学习—基础篇之基本数据类型(一)
  20. autorelease' is unavailable

热门文章

  1. 第18/24周 乐观并发控制(Optimistic Concurrency)
  2. SQL Server安全(7/11):使用跨数据库所有权链接(Cross-Database Ownership Chaining)的跨数据库安全
  3. 矢量化的HTML5拓扑图形组件设计
  4. QCustomplot使用分享(七) 层(完结)
  5. HTML的select控件美化
  6. kendo ui的treeView节点点击事件修改和grid的配置的一点总结
  7. for循环的执行顺序
  8. C++: read access data using ADOX.DLL and System::Data::OleDb
  9. 孙鑫MFC学习笔记8:对话框编程(下)
  10. 自行实现PHP代码注解特性