论文部分内容阅读
摘 要:RunTime是系统运行时的机制,其中最主要的是消息机制。本文主要对Runtime的消息机制进行研究并分析了其运行过程,最后结合实例阐述了该机制的使用方法。
关键词:Runtime 运行时 动态调用 消息机制
一、引言
目前,Obj-C被广泛应用于苹果的设备中,包括IOS系统,Mac OS系统等。虽然目前已有Swift出现,但是由于Obj-C有更好的底层属性值得研究,对于熟悉和深入研究苹果系统有非常高的研究价值。其中Runtime机制就是Obj-C的一大特色,能在运行期处理的机制。本文对消息机制进行了研究分析,并阐述了其实际运用。
二、Runtime中消息机制的研究
#include
void printHi(){printf(“Say Hi!\n”);}
void printBye(){printf(“Say Bye!\n”);}
void doTheTing(int type){
void (*func)();
if(type==0){
func = printHi;
}else{func = printBye;}
func();
return 0;}
在上述例子中,只有一个函数调用指令,待调用的的函数地址无法硬编码在指令中,而是要在运行期才能知道,这是一个动态绑定。在Obj-C中,如果要向一个对象传递一个消息,那么就会使用这种“动态绑定”机制来决定所需要调用的方法。
在Obj-C中,给对象发送消息可以这样写:
id value = [Object messageName:parameter];
这个实例中,Object是“接受者”(receiver),messageName叫做“选择子”(selector)。两者结合起来就是“消息”。编译器在读取这条消息后,会将其转变为一条普通的C语言函数调用。这个函数叫做objc_msgSend,其中“原型”如下:
id value = obj_msgSend(Object ,@selector(messageName:),parameter);
这就是运行期中Obj-C的消息机制,Obj-C中的类都继承自NSObject。
@interface NSObject {
Class isa OBJC_ISA_AVAILABILITY;
}
其中存在一个指向Class的isa指针,那么再来看下Class这个类。
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; }
在这个类中存在很多属性,一般一个Obj对象中的isa会指向普通的Class,这个Class中存储普通成员变量和对 象方法(“-”开头的方法),普通Class中的isa指针指向静态Class,静态Class中存储static类型成员变量和类方法(“+”开头的方法)。Class super_class:指向父类,如果这个类是根类,则为NULL。
三、Runtime机制的实际运用
在IOS或者Mac OS的编程中,经常会遇到归档与解档,常规的归档与解档要对数据进行序列化和反序列化,并且代码重用率很高。现在,通过Runtime的机制来对其进行操作。
首先是构建Cat的类文件,如下所示。
@protocol CatDelegate
- (void)catEat;
@end
@interface Cat : NSObject
#pragma mark - 属性
@property (nonatomic , assign) id delegate;
@property (nonatomic , copy) NSString *name;
@property (nonatomic , copy) NSString *sex;
@property (nonatomic , assign) int age;
#pragma mark - 方法
- (void)eat;
- (void)sleep;
@end
在此方法類中定义了name,sex,age等属性,通过之前的叙述,可以明白这些属性已经在Class中访问到,那么,我们通过改写.m文件来实现该类的归档与解档。如下所示
@interface Cat()
@end
@implementation Cat
-(void)encodeWithCoder:(NSCoder *)aCoder{
unsigned int count;
objc_property_t *properties = class_copyPropertyList([self class], &count);
for (int i =0; i objc_property_t property = properties[i];
const char *name = property_getName(property);
NSString *propertyName = [NSString stringWithUTF8String:name];
NSString *propertyValue = [self valueForKey:propertyName];
[aCoder encodeObject:propertyValue forKey:propertyName];
}free(properties);}
接下來,通过实现方法来看下具体的结果。如下代码和图1所示。
-(void)test{
Cat *cat = [[Cat alloc] init];
cat.name = @”猫1";
cat.age = 3;
cat.sex = @"公";
NSString *path = [NSString stringWithFormat:@"%@/archive",NSHomeDirectory()];
[NSKeyedArchiver archiveRootObject:cat toFile:path];
Cat *unarchiverCat = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"unarchiverCat== %@ %@",path , unarchiverCat);}
通过这种方法,归档和解档的步骤变得非常简单,也使程序的调度变得非常实用,高效。
四、结语
通过介绍Runtime的机制的使用方法,使得开发者可以懂得Obj-C真正的运行过程,灵活运用Runtime机制可以更好的操控程序,懂得如何在运行中控制程序,以深入理解Objective-C的Runtime数据结构、消息转发机制有助于更容易地阅读和学习开源项目。
参考文献:
[1] Matt Galloway. Effective Object-C 2.0:编写高质量ios与OS X代码的52个有效方法;机械工业出版社,2015,08.
[2] 刘乐,李敬兆. IOS内存开发管理机制的研究[J]; 安徽理工大学计算机科学与工程学院,2013,03.
[3] 王文东,竹林,建人. 汇编语言与C语言的混合程序设计技术[D]. 延安大学,2006,08.
[4] 钟冠贤. Object-C编程之道:IOS设计模式;北京:人民邮电出版社,2011,01.
[5] 唐巧,Blogger. IOS开发进阶[M].北京:电子工业出版社,2015,01.
关键词:Runtime 运行时 动态调用 消息机制
一、引言
目前,Obj-C被广泛应用于苹果的设备中,包括IOS系统,Mac OS系统等。虽然目前已有Swift出现,但是由于Obj-C有更好的底层属性值得研究,对于熟悉和深入研究苹果系统有非常高的研究价值。其中Runtime机制就是Obj-C的一大特色,能在运行期处理的机制。本文对消息机制进行了研究分析,并阐述了其实际运用。
二、Runtime中消息机制的研究
#include
void printHi(){printf(“Say Hi!\n”);}
void printBye(){printf(“Say Bye!\n”);}
void doTheTing(int type){
void (*func)();
if(type==0){
func = printHi;
}else{func = printBye;}
func();
return 0;}
在上述例子中,只有一个函数调用指令,待调用的的函数地址无法硬编码在指令中,而是要在运行期才能知道,这是一个动态绑定。在Obj-C中,如果要向一个对象传递一个消息,那么就会使用这种“动态绑定”机制来决定所需要调用的方法。
在Obj-C中,给对象发送消息可以这样写:
id value = [Object messageName:parameter];
这个实例中,Object是“接受者”(receiver),messageName叫做“选择子”(selector)。两者结合起来就是“消息”。编译器在读取这条消息后,会将其转变为一条普通的C语言函数调用。这个函数叫做objc_msgSend,其中“原型”如下:
id value = obj_msgSend(Object ,@selector(messageName:),parameter);
这就是运行期中Obj-C的消息机制,Obj-C中的类都继承自NSObject。
@interface NSObject
Class isa OBJC_ISA_AVAILABILITY;
}
其中存在一个指向Class的isa指针,那么再来看下Class这个类。
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; }
在这个类中存在很多属性,一般一个Obj对象中的isa会指向普通的Class,这个Class中存储普通成员变量和对 象方法(“-”开头的方法),普通Class中的isa指针指向静态Class,静态Class中存储static类型成员变量和类方法(“+”开头的方法)。Class super_class:指向父类,如果这个类是根类,则为NULL。
三、Runtime机制的实际运用
在IOS或者Mac OS的编程中,经常会遇到归档与解档,常规的归档与解档要对数据进行序列化和反序列化,并且代码重用率很高。现在,通过Runtime的机制来对其进行操作。
首先是构建Cat的类文件,如下所示。
@protocol CatDelegate
- (void)catEat;
@end
@interface Cat : NSObject
#pragma mark - 属性
@property (nonatomic , assign) id
@property (nonatomic , copy) NSString *name;
@property (nonatomic , copy) NSString *sex;
@property (nonatomic , assign) int age;
#pragma mark - 方法
- (void)eat;
- (void)sleep;
@end
在此方法類中定义了name,sex,age等属性,通过之前的叙述,可以明白这些属性已经在Class中访问到,那么,我们通过改写.m文件来实现该类的归档与解档。如下所示
@interface Cat()
@implementation Cat
-(void)encodeWithCoder:(NSCoder *)aCoder{
unsigned int count;
objc_property_t *properties = class_copyPropertyList([self class], &count);
for (int i =0; i
const char *name = property_getName(property);
NSString *propertyName = [NSString stringWithUTF8String:name];
NSString *propertyValue = [self valueForKey:propertyName];
[aCoder encodeObject:propertyValue forKey:propertyName];
}free(properties);}
接下來,通过实现方法来看下具体的结果。如下代码和图1所示。
-(void)test{
Cat *cat = [[Cat alloc] init];
cat.name = @”猫1";
cat.age = 3;
cat.sex = @"公";
NSString *path = [NSString stringWithFormat:@"%@/archive",NSHomeDirectory()];
[NSKeyedArchiver archiveRootObject:cat toFile:path];
Cat *unarchiverCat = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"unarchiverCat== %@ %@",path , unarchiverCat);}
通过这种方法,归档和解档的步骤变得非常简单,也使程序的调度变得非常实用,高效。
四、结语
通过介绍Runtime的机制的使用方法,使得开发者可以懂得Obj-C真正的运行过程,灵活运用Runtime机制可以更好的操控程序,懂得如何在运行中控制程序,以深入理解Objective-C的Runtime数据结构、消息转发机制有助于更容易地阅读和学习开源项目。
参考文献:
[1] Matt Galloway. Effective Object-C 2.0:编写高质量ios与OS X代码的52个有效方法;机械工业出版社,2015,08.
[2] 刘乐,李敬兆. IOS内存开发管理机制的研究[J]; 安徽理工大学计算机科学与工程学院,2013,03.
[3] 王文东,竹林,建人. 汇编语言与C语言的混合程序设计技术[D]. 延安大学,2006,08.
[4] 钟冠贤. Object-C编程之道:IOS设计模式;北京:人民邮电出版社,2011,01.
[5] 唐巧,Blogger. IOS开发进阶[M].北京:电子工业出版社,2015,01.