一、前言 官方对于NSObject的解释如下: The root class of most Objective-C class hierarchies, from which subclasses inherit...二、NSObject.h方法分类 1.加载及初始化方法 2.消息发送方法 3.复制方法 4.判断方法 5.内存管理方法 2.1、加载及初始化方法 /** 运行时加载类或分类调用该方法, 每个类只会调用一次...NS_DESIGNATED_INITIALIZER #endif ; /** 为新对象分配内存空间并初始化, 等于[[NSObject alloc] init] */ + (instancetype..._ #define _OBJC_NSOBJECT_H_ #if __OBJC__ #include #include ...NSObject> { Class isa OBJC_ISA_AVAILABILITY; } /** 运行时加载类或分类调用该方法, 每个类只会调用一次 */ + (void)load; /**
NSObject 类被编译成了 NSObject_IMPL 的结构体。 Person 类被编译成了 Person_IMPL 的结构体。...Person 类的内部还增加了一个 NSObject_IMPL 的结构体 我们知道 Person 继承于 NSObject, 所以它的底层实现中是第一个成员是父类的结构体,就是底层继承的实现方式。...NSObject_IMPL 是 NSObject 类的编译后的结构体,它的内部只有一个 Class 类型的 isa 成员变量。
具体使用如下所示: NSObject *object1 = [[NSObject alloc] init]; NSObject *object2 = [[NSObject alloc] init];...objClass = [NSObject class]; NSLog(@"NSObject class = %p", objClass); } 打印结果如下: JLDog meta class...meta class = 0x7fff89e06698 NSObject meta class's superClass = 0x7fff89e066c0 NSObject class = 0x7fff89e066c0...其中: NSObject meta class's superClass = 0x7fff89e066c0 NSObject class = 0x7fff89e066c0 由上图可知,JLDog的元类对象...六 小结 通过上面的分析,将NSObject对象分成了实例对象、类对象和元类对象,进而了解了不同对象中的职责和存储的信息不同,从而对NSObject对象有了更深层次的了解。
1 NSObject源码实现分析 Objective-C NSObject的实现分析(2014-10-23更新) http://blog.csdn.net/uxyheaven/article/details
一个NSObject对象占用多少个字节?...在Objective-C中,我们可以通过一些方法来获取一个NSObject对象占用多少字节 代码获取NSObject实例对象的成员变量字节大小 * 获取一个NSObject实例对象的成员变量所占用的字节大小...Class; int main(int argc, const char * argv[]) { @autoreleasepool { NSObject *obj = [[NSObject...对象本质上是C++的结构体,结构大概长这样 // NSObject Implementation struct NSObject_IMPL { Class isa; // 8个字节 }; 通过objc...对象占用多少字节 回答 系统分配了16个字节给NSObject对象(通过malloc_size函数获得) 但是NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize
疑惑 在OC程序中,我们知道NSObject是“万物之源”,所有的类的都继承自NSObject,我们疑惑的是在OC的底层NSObject是什么样的? 类的结构在OC底层是什么样的?...这篇文章我们将深入OC底层探究NSObject的结构。 OC底层的NSObject 1、clang命令获取main.m的C++代码 为了知道NSObject底层是什么样的,clang也许是一个选择。...实例对象的isa指向的是类; 类的isa指向的元类; 元类指向根元类; 根元类指向自己; NSObject的父类是nil,根元类的父类是NSObject。...这样分析起来我们有理由相信NSObject的OC底层实现是objc_object,objc_class是类的OC底层实现,而且两者之间应该还会存在这谋种关系。
func stop() {} } class MyClass: NSObject, MyServiceDelegate { private lazy var service: MyService...其实出现这个 Crash 有三个条件: lazy weak NSObject 示例代码去除这三个条件中任何一个,Crash 都不会发生。...就是下面这样: class MyClass: NSObject, MyServiceDelegate { private var isServiceInit = false private...class MyClass: NSObject, MyServiceDelegate { private lazy var service = Lazy {
在Objective-C中,我们可以通过一些方法来获取一个NSObject对象占用多少字节 代码获取NSObject实例对象的成员变量字节大小 * 获取一个NSObject实例对象的成员变量所占用的字节大小...Implementation struct NSObject_IMPL { Class isa; // 8个字节 }; // 指针 // typedef struct objc_class *...Class; int main(int argc, const char * argv[]) { @autoreleasepool { NSObject *obj = [[NSObject...对象本质上是C++的结构体,结构大概长这样 // NSObject Implementation struct NSObject_IMPL { Class isa; // 8个字节 }; 通过objc...对象占用多少字节 回答 系统分配了16个字节给NSObject对象(通过malloc_size函数获得) 但是NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize
具体使用如下所示: NSObject *object1 = [[NSObject alloc] init]; NSObject *object2 = [[NSObject alloc] init];...objClass = [NSObject class]; NSLog(@"NSObject class = %p", objClass); } 打印结果如下: JLDog meta class...meta class = 0x7fff89e06698 NSObject meta class's superClass = 0x7fff89e066c0 NSObject class = 0x7fff89e066c0...其中: NSObject meta class's superClass = 0x7fff89e066c0 NSObject class = 0x7fff89e066c0 由上图可知,JLDog的元类对象...小结 通过上面的分析,将NSObject对象分成了实例对象、类对象和元类对象,进而了解了不同对象中的职责和存储的信息不同,从而对NSObject对象有了更深层次的了解。
区分:类的NSObject与协议的NSObject iOS开发中,苹果提供的一些系统类都属于NSObject的子类,例如UIColor类的定义如下所示。 ?...UIColor 或者自定义的类,也继承自NSObject,例如下图所示。 ? 自定义类的父类 但是,NSObject不仅仅代表基类,还有协议的意思,我们可以称之根协议,例如下图所示: ?...NSObject协议 事实上,从NSObject类的定义可知,NSObject的类本身就遵循NSObject协议,如下图所示。 ? NSObject 2....协议NSObject的用法 NSObject协议的定义 ?...@protocol MyTextFieldDelegate NSObject,UITextFieldDelegate> //...
本章接着NSObject头文件解析 / 消息机制 / Runtime解读(一)写 给类添加属性: BOOL class_addProperty(Class cls, const char *name,...viewDidLoad { [super viewDidLoad]; //创新新类 Class NewClass = objc_allocateClassPair([NSObject
NSObject头文件解析 当我们需要自定义类都会创建一个NSObject子类, 比如: #import @interface ClassA : NSObject...@end 那么NSObject里面具体有什么呢?...我们点到它的头文件里面去看看 @interface NSObject NSObject> { Class isa OBJC_ISA_AVAILABILITY; //每个NSObject对象都拥有一个...我们来看下, 定义一个NSobject子类ClassA, 新增两个方法 #import @interface ClassA : NSObject...@"YES": @"NO"); NSLog(@"aClass isMemberOfClass: NSObject: %@", [aClass isMemberOfClass:[NSObject
在整理复习 runtime 知识点的过程中,发现不得不巩固 runtime 关于数据结构方面的知识,所以单独开篇关于 NSObject 文章 目录 ---- 准备:runtime 源码 1....因此想要深入学习 iOS 底层知识,NSObject 类拿来开刀再合适不过了(一脸正经:哈哈哈(ಡωಡ)hiahiahia) 首先,进入查看 NSObject 类结构 @interface NSObject...NSObject> { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wobjc-interface-ivars"...---- 上面所写的,是对 NSObject 类的结构分析,文章初衷是计划把 IMP 、NSInvocation、以及 NSObject 类初始化流程等 runtime 知识点都囊括,作为一个总结。...但 runtime 的内容真的不是一两篇就可以写完的,写作过程中发现仅仅是 NSObject 的数据结构介绍就占用了这么多篇幅。下一篇准备写下 NSObject 类在初始化流程。
*obj = [[NSObject alloc] init]; } return 0; } 执行上述命令后,得到的结果如下: struct NSObject_IMPL { Class...*obj = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)((NSObject *(*)(id, SEL))(void *)objc_msgSend...struct NSObject_IMPL { Class isa; }; 如何获取NSObject对象的内存大小?...在64位架构下, 系统分配了16个字节给NSObject对象(通过malloc_size函数获得); 但NSObject对象内部只使用了8个字节的空间(可以通过class_getInstanceSize...NSObject_IVARS,即Class类型的成员变量。
从runtime源代码层面去研究下NSObject类初始化相关方法:load、initialize,以及在调用时内部做了什么 目录 ---- 一、load 方法 1. load_images ...关于 static Class realizeClass(Class cls) 函数的作用,前篇文章runtime的那些事(二)——NSObject数据结构已做介绍,为了能够让类对应的分类信息加载至类结构体中
@protocol MGSwipeTableCellDelegate NSObject> @optional 首先要注意,NSObject是所有object-C的根类,NSObject>是NSObject...因为这个协议中定义了一些基本的方法,由于我们使用的所有类都继承NSObject这个基类,而这个基类遵守了NSObject>这个协议,那么也就实现了其中的那些方法,这些方法当然可以由NSObject及其子类对象调用...>这个协议中的方法之一,所以,我们自定义的协议都需要继承NSObject>。...本段一开始便说道:NSObject>中的方法在NSObject基类中实现了,那么无需再关心实现了,直接调用NSObject>中的方法吧。...NSObject> @protocol NSObject - (BOOL)isEqual:(id)object; @property (readonly) NSUInteger hash; @property
NSObjcet的底层实现,点击NSObjcet进入发现NSObject的内部实现 @interface NSObject NSObject> { #pragma clang diagnostic push...但是我们发现NSObject对象中还有很多方法,那这些方法不占用内存空间吗?其实类的方法等也占用内存空间,但是这些方法所占用的存储空间并不在NSObject对象中。...而通过上面的实验我们知道NSObject_IMPL内部其实就是Class isa 那么我们假设 struct NSObject_IMPL NSObject_IVARS; 等价于 Class isa;...*object1 = [[NSObject alloc] init]; NSObject *object2 = [[NSObject alloc] init]; Student...我们通过如下代码证明: NSObject *object = [[NSObject alloc] init]; Class objectClass = [NSObject class]; Class objectMetaClass
的底层实现代码如下: struct Student_IMPL { struct NSObject_IMPL NSObject_IVARS; int _age; int _no; }; struct...NSObject_IMPL { Class isa; }; 所以,OC的对象、类都是基于C/C++当中结构体实现的。...那么,一个NSObject对象占用多少内存呢? 通过以上代码,我们发现一个NSObject对象占用的内存大小是一个指针变量所占用的大小(64bit,8个字节。...NSObject *obj1 = [[NSObject alloc] init]; NSObject *obj2 = [[NSObject alloc] init];...([NSObject class]); objMetaClass1、objMetaClass2就是NSObject的meta-class对象(元类对象) 每个类在内存中有且只有一个meta-class对象
第四道 BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]]; BOOL re2 = [(id)[NSObject...的isa -> 根元类 与 NSObject不相同 第二次循环:根元类的superclass -> NSObject 与NSObject相同 所以是通过根元类的父类又回到NSObject这条线找到的...第五道 BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]]; // BOOL re6 = [(id...)[NSObject alloc] isMemberOfClass:[NSObject class]]; // BOOL re7 = [(id)[HRTest alloc] isKindOfClass...第六道 objc_object 、objc_class、 NSObject、类之间的关系 NSObject是OC中对象的基类;objc_object是C++/C中对象的基类,更偏向底层。
父元类.super -> 根元类.super -> 根类.super -> nil 元类.isa = 父元类.isa = 根元类.isa = 根元类 应用:判断对象类型 下面的打印结果是什么: // [NSObject...class] = NSObject // object_getClass((id)[NSObject class]) = NSObject meta class // 沿着 NSObject 的继承者链去找根元类...-> 根类 == NSObject meta class 或者 NSObject meta class 的父类的实例 BOOL res1 = [(id)[NSObject class] isKindOfClass...:[NSObject class]]; BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]]; BOOL res3 =
领取专属 10元无门槛券
手把手带您无忧上云