[读书笔记]iOS与OS X多线程和内存管理 [Blocks部分-2]
int main() {
void(^testBlock)(void)=^{
printf("i am testBlock");
};
testBlock();
void *isa;
int Flags;
int Reserved;
void *FuncPtr;
struct __block_impl impl;
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
static struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};
int main() {
void(*testBlock)(void)=(void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA);
((void (*)(__block_impl *))((__block_impl *)testBlock)->FuncPtr)((__block_impl *)testBlock);
}
struct __block_impl impl;
void *isa;
int Flags;
int Reserved;
void *FuncPtr;
size_t reserved;
size_t Block_size;
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
结构体:
struct
__main_block_impl_0 {
//__block_impl
void
*isa;
int Flags; int Reserved;
void
*FuncPtr;
//
struct __main_block_desc_0* Desc;
};
|
初始化:
//
isa = &_NSConcreteStackBlock;
Flags = 0;
Reserved=0
FuncPtr =__main_block_func_0;
//
Desc =&__main_block_desc_0_DATA;
|
接下来解释一下 isa = &_NSConcreteStackBlock;这句话。
Block是OC对象,“id”用来存储OC对象,id类型也能够在c语言中声明:
typedef struct objc_object{
Class isa;
} *id;
id 为objc_object结构体指针类型。Class的定义如下:
typedef struct objc_class*Class;
Class为objc_class结构体的指针类型,objc_class结构体在模拟器目录下/usr/include/objc/runtime.h(导入
#import
<objc/runtime.h>点击可进入)中声明如下(除去无关宏定义):
struct
objc_class {
Class isa;
};
objc_class与结构体objc_object的定义相同。但是分别是在类与对象中使用的结构体,下面通过简单的OC类声明来验证一下。
@interface
MyObject : NSObject
{ int val0; int val1; } @end
基于objc_object结构体,该类的对象的结构体如下:
struct
MyObject{
Class isa; int val0; int val1; };
类中的实例变量被包含在对象的结构体中,类生成对象意味着类生成该类的对象的各个结构体实例,通过成员变量isa保持该类的结构体实例指针(即isa为指向所属类的结构体实例的指针),如下图:
各类的结构体就是基于objc_class结构体的class_t结构体,class_t结构体在objc4运行时库的声明如下:
struct
class_t{
struct class_t *isa; struct class_t *superclass; Cache cache; IMP *vtable; uintptr_t data_NEVER_USE; };
在OC中,各个类的结构体实例均生成并保持各个类的class_t结构体实例。该实例存有类的相关信息,包括持有声明的成员变量、方法的名称、方法的实现(函数指针)、属性即父类的指针,并被OC运行时库所使用。
|
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。