Object_c底层细节
来源:互联网 发布:批处理图片的软件 编辑:程序博客网 时间:2024/05/17 00:58
首先我们来看一下c语言中的struct的内存表示:
typedef structintStruct
{
}intStruct;
结构体在内存中的表示为:
00 00 00 0A
如果我们简单的定义一个int并赋值,这个int在内存中的表示为:
int i =10;
00 00 00 0A
结构体和int在内存中的表示是一样的!
如果我们定义的结构体更为复杂,有多个变量,那么它们在内存中是依次排列的(不考虑大端小端的情况)。在内存中排列一致,导致intStruct和int可以相互转换。
当你在看apple开发文档时发现toll-freebridged这种字眼时(经常发生在NS***和CF***之间),表明它们是可以相互转换的,因为它们在内存中的排列是一致的。例如NSarray和CFArrayRef(NS为cocoa,CF为corefoundation)
CFArrayRef arrayRef = //somevalue;
NSArray *array =(NSArray*)arratRef;
我们回头再看NSObject的定义,理解下为什么objective-c称之为objective-c.
@interfaceNSObject<NSObject>{
}
@interface关键字告诉编译器:请将NSObject作为objective-c的一个类名,并将它转换成一个struct:
struct NSObject{
Class isa;
};
看到了吧,所有的object都是c的结构体。
我们再来看下Class的定义:
typedef struct obj_class *Class;
struct obj_class{
}
objc_class包含了objc类所需的所有信息,例如变量列表,方法列表,满足的protocol等等。这些信息可以通过gdb将感兴趣的信息打印出来.
我们注意到,NSobject和objc_class都有一个isa变量,NSObject的isa描述它的元信息(即object的类信息),objc_class描述类的类信息(即类的元信息)。这样,同object一样,class也是一种object,它在obj_class的isa中可以记录classmethod(用 + 声明的方法)。
Objc中的runtime reflection就是根据这信息操作的。
方法:
当你在为object定义方法时,例如:
@implementationMyClass
@end
编译器会相应的转换为:
void [-someMethod:](id self, SEL_cmd, NSString*param){}
_cmd为方法的调用方(receiver), _cmd为方法签名(跟你用@selector得到的一样),后续为方法需要的参数。
当你调用方法时,objective-c会将方法调用都会转成c的方法调用。例如当你在程序里写如下语句时:
[myClasssomeMethod:@"bytedance"]
会相应的转换为:
objc_msgSend(myClass,@selector(someMethod:), @"bytedance")
@selector本质是一个c string,唯一与cstring不同的是在整个内存空间中,同一方法签名的@selector的内存地址是相同的,这样在比较方法签名时候不需要采用同strcmp这么耗时的操作,而通过比较@selector的内存地址即可。
如果调用方没有找到相应的方法,会调用 [NSObject
- Object_c底层细节
- Object_c底层细节
- object_c
- epoll底层细节
- epoll底层细节
- VSAN底层架构细节
- 嵌入式底层开发的一些细节
- object_c得到SHA1值
- Object_c使用技巧
- Object_c的retain机制
- Object_c的retain机制
- IOS语言object_c语言
- object_c id 与 instancetype
- Object_C 回顾 0.0.1
- Object_C 回顾 0.0.2
- Object_C 回顾 0.0.3
- Object_C内存管理
- mysql主主/主从同步以及同步的底层细节
- SQLibs iOS开发常用代码库
- iOS 开发常用尺寸
- "/usr/include/sqlite3.h" …
- git笔记--基础
- ShareKit 中SHK.m中的编译错…
- Object_c底层细节
- TortoiseSVN切换登录用户
- iOS 拨打电话相关知识总结
- 进程名字的赋值
- iOS 播放流媒体 服务端配置备份
- 一行代码,在 iPhone 应用中…
- 用UIWebView,JS获取视频链接
- iPhone app 内嵌httpserver
- android 混淆