iOS程序员

Objective-C动态语言的特征体现在哪?

2017-09-05  本文已影响52人  朝雨晚风

1、静态和动态概念

静态:在程序编译阶段就能确定数据类型和所调用的方法;
动态:将程序在编译阶段就能确定数据类型和所调用的方法,推迟到了运行时。

2、OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载

id obj = someInstance;
if ([obj isKindOfClass:someClass]) {    
someClass *classSpecifiedInstance = (someClass *)obj;  
}
 /*
  * 比如给button 添加一个点击方法,但ViewController 中不定义这个方法,编译 OK,
  * 点击按钮的时候就会报错-[ViewController oneMethod:]: unrecognized selector sent to instance
 */
   UIButton *button  = [UIButton buttonWithType:UIButtonTypeCustom];
   [button addTarget:self action:@selector(oneMethod:) forControlEvents:UIControlEventTouchUpInside];

3、对动态绑定@selector(selector) 的补充

点进去会发现selector 是 SEL 类型的 @property (nonatomic, assign) SEL selector;
SEL变量是一个整数,本质就是类方法的编号(函数地址),@selector()就是取类方法的编号,返回的结果是一个SEL类型。

@interface Person : NSObject 
+ (void)test1; 
- (void)test2; 
@end 
    // 根据.h文件中定义的Person类和方法 执行完这行代码 在内存中如下 
    Person *person = [[Person alloc] init];
Person 类的内存布局
方法的存储位置
  1. 在内存中每个类的方法都存储在类对象中
  2. 每个方法都有一个与之对应的SEL类型的数据
  3. 根据一个SEL数据就可以找到对应的方法地址,进而调用方法
  4. SEL类型的定义: typedef struct objc_selector *SEL
上一篇 下一篇

猜你喜欢

热点阅读