深入浅出Cocoa 之动态创建类
CC许可,转载请注明出处
在前文《深入浅出Cocoa之类与对象》一文中,我已经详细介绍了ObjC中的
Class 与 Object 的概念,今天我们来如何在运行
时
动态创建类。下面这个函数就是应用前面讲到的Class,MetaClass的概念,在运行时动态创建一个类。这个函数来自《Inside Mac OS X-The Objective-C Programming Language》。
#import<objc/objc.h>
#import<objc/runtime.h>
BOOLCreateClassDefinition(
constchar*name,
constchar*superclassName)
{
structobjc_class*meta_class;
structobjc_class*super_class;
structobjc_class*new_class;
structobjc_class*root_class;
va_listargs;
//确保父类存在
super_class=(
structobjc_class*)objc_lookUpClass(superclassName);
if(super_class==nil)
{
returnNO;
}
//确保要创建的类不存在
if(objc_lookUpClass(name)!=nil)
{
returnNO;
}
//查找 root class,因为 meta class 的 isa 指向 root class 的 meta class
root_class=super_class;
while(root_class->super_class!=nil)
{
root_class=root_class->super_class;
}
//为class及其metaclass 分配内存
new_class=calloc(2,
sizeof(
structobjc_class));
meta_class=&new_class[1];
//设置class
new_class->isa=meta_class;
new_class->info=CLS_CLASS;
meta_class->info=CLS_META;
//拷贝类名字,这里为了提高效率,让 class 与 meta class 都指向同一个类名字符串
new_class->name=malloc(strlen(name)+1);
strcpy((
char*)new_class->name,name);
meta_class->name=new_class->name;
//分配并置空 methodlists,我们可以在之后使用
class_addMethods 向类中增加方法
new_class->methodLists=calloc(1,
sizeof(
structobjc_method_list*));
meta_class->methodLists=calloc(1,
sizeof(
structobjc_method_list*));
//将类加入到继承体系中去:
//1,设置类的 super class
//2,设置 meta class 的 super class
//3,设置 meta class 的 isa
new_class->super_class = super_class;
meta_class->super_class=super_class->isa;
meta_class->isa=(
void*)root_class->isa;
//最后,将 class 注册到运行时系统中
objc_addClass(new_class);
returnYES;
}
如果要在代码中使用运行时相关的函数,我们需要导入 libobjc.dylib,并导入相关的头文件(比如这里的 runtime.h)。在前文中总结到“ObjC
为每个类的定义生成两个 objc_class ,一个即普通的 class,另一个即 metaclass。我们可以在运行期创建这两个 objc_class 数据结构,然后使用 objc_addClass 动态地创建新的类定义。”,这在上面的代码中就体现出来了:new_class 和 meta_class 就是新类所必须的两个 objc_class。其他的代码就不解释了,注释以及代码足以自明了。在实际的运用中,我们使用 ObjC 运行时函数来动态创建类:
Classobjc_allocateClassPair(Classsuperclass,constchar*name,size_textraBytes);
譬如:
#import<objc/objc.h>
#import<objc/runtime.h>
voidReportFunction(idself,SEL_cmd)
{
NSLog(@">>Thisobjectis%p.",self);
NSLog(@">>Classis%@,andsuperis%@.",[selfclass],[selfsuperclass]);
ClassprevClass=NULL;
intcount=1;
for(ClasscurrentClass=[selfclass];currentClass;++count)
{
prevClass=currentClass;
NSLog(@">>Followingtheisapointer%dtimesgives%p",count,currentClass);
currentClass=object_getClass(currentClass);
if(prevClass==currentClass)
break;
}
NSLog(@">>NSObject'sclassis%p",[NSObjectclass]);
NSLog(@">>NSObject'smetaclassis%p",object_getClass([NSObjectclass]));
}
intmain(intargc,constchar*argv[])
{
@autoreleasepool
{
ClassnewClass=objc_allocateClassPair([NSStringclass],"NSStringSubclass",0);
class_addMethod(newClass,@selector(report),(IMP)ReportFunction,"v@:");
objc_registerClassPair(newClass);
idinstanceOfNewClass=[[newClassalloc]init];
[instanceOfNewClassperformSelector:@selector(report)];
[instanceOfNewClassrelease];
}
return0;
}
在上面的代码中,我们创建继承自 NSString 的子类NSStringSubclass,然后向其中添加方法
report,并在运行时系统中注册,这样我们就可以使用这个新类了。在这里使用 performSelector 来向新类的对象发送消息,可以避免编译警告信息(因为我们并没有声明该类及其可响应的消息)。执行结果为:
>>Thisobjectis0x100114710.
>>ClassisNSStringSubclass,andsuperisNSString.
>>Followingtheisapointer1timesgives0x100114410
>>Followingtheisapointer2timesgives0x100114560
>>Followingtheisapointer3timesgives0x7fff7e257b50
>>NSObject'sclassis0x7fff7e257b78
>>NSObject'smetaclassis0x7fff7e257b50
根据前文中的类关系图,我们不难从执行结果中分析出 NSStringSubclass 的内部类结构:1,对象的地址为 :0x1001147102,class 的地址为:0x1001144103,meta class 的地址为:0x1001145604,meta class 的 class 地址为:0x7fff7e257b50(也是
NSObject 的 meta class)
5,NSObject 的 meta class 的meta class 是其自身
分享到:
相关推荐
- [深入浅出Cocoa]之类与对象 - [深入浅出Cocoa]之动态创建类 - [深入浅出Cocoa]之消息 - [深入浅出Cocoa]之消息(二)-详解动态方法决议 - [深入浅出Cocoa]详解键值观察(KVO)及其实现机理 - [深入浅出Cocoa]之...
"深入浅出讲Objective-c"的文档很可能涵盖了这些内容,并可能包含更多关于类设计、异常处理、调试技巧等实际开发中的细节。通过学习这份文档,初学者可以系统地掌握Objective-C的基础知识,并逐步进入iOS和macOS应用...
本书通过对Cocoa框架中的设计模式深入浅出的讲解,提供了对这些设计模式为何存在以及如何应用的深刻理解。书中不但详细介绍了常见的设计模式,如单例模式、委托模式、观察者模式等,还探讨了它们在Cocoa框架中的实现...
### Objective-C语法深入浅出-适合作为学习iOS开发的入门材料 #### 一、Objective-C简介 **Objective-C**是一种面向对象的编程语言,它建立在C语言的基础之上,并且是C语言的一个超集。这意味着您可以在Objective-...
《iPhone开发:Cocoa教程中文PDF》是一本专为初学者设计的,深入浅出的iOS应用程序开发指南。这本书的核心内容是围绕Cocoa Touch框架展开,这是Apple为iOS设备(包括iPhone、iPad等)开发应用的主要工具。Cocoa ...
对于Cocoa开发者而言,《Cocoa设计模式》这本书的价值在于它提供了一个系统性的框架,帮助读者深入理解Cocoa框架的核心机制,并且通过具体的设计模式应用示例,让开发者能够快速上手,并将其应用于自己的项目中。...
综上所述,"Using Swift with Cocoa and Objective-C(4.1)"文档深入浅出地阐述了如何在Cocoa和Objective-C环境中集成Swift,为开发者提供了宝贵的指导,帮助他们构建更加高效且易于维护的跨语言项目。通过阅读这份...
这本书深入浅出地讲解了使用Cocoa Touch框架和Objective-C语言进行iPhone(以及后来的iOS设备)应用开发的基本概念和实践技巧。 在iOS开发中,Objective-C是主要的编程语言,它是一种面向对象的语言,基于C语言,并...
这本书深入浅出地介绍了Xcode作为苹果平台主要的集成开发环境(IDE)的基础知识,以及如何使用它来构建iOS和macOS应用。 在C++部分,本书将带你了解编程的基础,包括变量、数据类型、运算符、流程控制语句(如if...
本教程将深入浅出地介绍Object-C的基础知识,帮助初学者快速入门。 ### 一、Object-C简介 Object-C是在C语言基础上扩展的,增加了面向对象的特性,如类、继承、消息传递等。它的语法与Smalltalk非常相似,但同时也...
总之,《使用Quartz 2D与PDF图形在Mac OS X编程》这本书深入浅出地介绍了如何在Mac平台上使用Quartz 2D进行高效且美观的图形编程,不仅适合Mac OS X的开发者,对于其他平台的程序员来说也具有很高的参考价值。
- **Objective-C简介**:本书为初学者提供了深入浅出的Objective-C介绍,无需预先掌握面向对象编程语言或C语言的基础。 - **编程入门**:通过实例介绍如何编写基本的Objective-C程序,包括变量、数据类型、运算符等...
《BecomeAnXcoder》是一本专为初学者设计的iPhone和Mac OS开发教程,它以其通俗易懂的语言和深入浅出的讲解,帮助读者快速掌握Objective-C编程语言以及图形和非图形程序设计的基础知识。本教程是那些希望踏入苹果...
- **Matt Long**:本书深入浅出地介绍了 Objective-C 语言的特点,适合新老程序员阅读。 - **Cory Bohon**:本书易于理解,无需预先了解 C 语言即可开始学习。 - **Andy Lee**:本书既技术性强又不失可读性。 #### ...
《Objective-C Fundamentals》这本书通过深入浅出的讲解和丰富的实例,为读者构建了一个完整的Objective-C学习体系,有助于提升开发者的编程技能和理解力。配合书中的"Readme.png"文件,可能是对书的简介或使用说明...
### Objective-C基础教程:iPhone开发必备 ...对于希望从事iOS开发的专业人士来说,《Objective-C基础教程》是一本不可多得的好书,它不仅深入浅出地讲解了Objective-C的各种特性,还通过丰富的示例帮助读者快速上手。
《Object C基础教程(第二版)》是一本深入浅出介绍Objective-C编程语言的书籍,主要面向初学者,旨在帮助读者快速掌握Objective-C的核心概念和编程技巧。Objective-C是Apple开发的一种面向对象的编程语言,它是开发...