今天在园子里看到了一篇牛文“Objective-C 2.0 with Cocoa Foundation--- 5,Class类型,选择器Selector以及函数指针 ”,讲得十分精彩,忍不住把它的代码加上注释整理于此...个人体会:obj-C中的“Class类型变量”比c#中的Object基类还要灵活,可以用它生成任何类型的实例(但是它又不是NSObject)。...而选择器SEL与函数指针IMP,如果非要跟c#扯上关系的话,这二个结合起来,就点类似c#中的反射+委托,可以根据一个方法名称字符串,直接调用方法。...[3]; //定义二个选择器 SEL say; SEL skin; //定义一个函数指针(传统C语言的处理方式) void(*setSkinColor_Func)(id,SEL,NSString...*); //定义一个IMP方式的函数指针(obj-C中推荐的方式) IMP say_Func; //定义一个类 Class bullClass; } -(void) doWithCattleId
mallco是分配虚拟内存 C语言使用 malloc函数动态在堆上分配内存。malloc根据字节数的参数。如果无法分配内存,该函数将返回指向已分配内存的指针或 NULL 指针。...系统只是为内存分配留出地址空间。当尝试使用内存时,就会发生物理分配。然后它可能会失败。 当询问程序使用多少内存时,对 malloc 的调用相加是错误的,因为这是虚拟内存使用量。...因此,依靠 malloc 确定分配是否成功是一个困难的问题。只有在写入和读取新分配的内存时才能发现。...---- 设置是否开启过量内存 通过 /proc/sys/vm/overcommit_memory查看是否支持过量内存。Windows 不允许过量使用(但仍使用相同的虚拟/物理内存设计)。...;如果是 1,则该进程在一段时间后被 OOM 杀手终止(我的笔记本电脑没有 1T内存),通常将 /proc/sys/vm/overcommit_memory 设置为0。
但我怎么知道变量的分布是高斯分布呢。本文重点介绍了保证变量分布为高斯分布的几种方法。 本文假定读者对高斯/正态分布有一定的了解。...,col].set_title(c) col += 1 ?...来确定是否是正态分布 在Python中,可以使用' scipy '的' shapiro '函数执行shapiro - wilk检验。如下所示。...以上结果表明变量0和1为高斯。此测试并不期望分布是完全正态分布,而是接近正态分布。 总结 这些是用于测试数据正常性的许多方法中的几种。...我个人更喜欢结合以上所有方法来确定变量的分布是否为高斯分布,同时要牢记所使用的数据,问题和模型。
https://blog.csdn.net/10km/article/details/80756389 如果你熟悉C语言,应该知道这个问题的答案是no....但是,这个问题的答案其实并不是绝对是NO,虽然C语言标准中并没有提供类型判断的能力,但不同的C编译器在实现时会根据需要对C语言提供扩展功能。比如GNU C(gcc)....gcc 通过内置函数(Built-in Function) __builtin_types_compatible_p为C语言提供了运行时的类型判断功能: 示例如下: #include #include void test(int x){ // 判断x是否为void类型 if(__builtin_types_compatible_p(typeof...not void"); } } int main(void) { test(2); return EXIT_SUCCESS; } 输出 is not void 上面的代码实现判断类型是否为
在我们明确了问题的痛点之后,我们可以进一步探究一下Go语言是如何解决这些问题,并且将高并发作为Go语言的一项特色功能。...我们都知道,操作系统的CPU最小调度单位是线程,然而Go语言却使用了协程的概念。那么问题来了,Go语言是如何将这些协程交给CPU来处理的呢?
类的本质与isa指针及SEL指针的关系 Class Class 被定义为一个指向 objc_class的结构体指针,这个结构体表示每一个类的类结构。...IMP IMP 的定义为: typedef id (*IMP)(id, SEL, ...); 我们知道 id是一个指向 objc_object 结构体的指针,该结构体只有一个成员isa,所以任何继承自...如何理解消息机制: (1)在Objective-C中,message与方法是在执行阶段绑定的,而不是编译阶段。...在继续之前,需要明确Objective-C中 消息 的概念。...---- 参考文章: 深入Objective-C的动态特性 关于CLASS , SEL, IMP的说明 唐巧-Objective-C对象模型及应用
所有事物都应该是对象(严格来说 Objective-C并没有完全做到这一点,因为它有象int,double这样的简单 变量类型) 在Objective-C语言中,每一个类实际上也是一个对象。...6.如何查询类型信息 可以使用“类型信息查询方法”来查询类的继承体系。其中,“isMemberOfClass:”可以判断对象是否是特定类的实例。...Objective-C与其他语言不同,Objective-C必须查询类型信息,才能完全了解对象的真实类型。...若是如此,那就应该使用==操作符,而不要使用比较Objective-C对象使常用的“isEqual:”方法。因为==操作符比较的是指针是否相等,也就是比较内存地址是否相同。...而"isEqual:"比较的是两个Objective-C对象的值是否相等。
对象系统的基石:struct objc_class结构如下: isa指针:指向该对象所属类型的类型对象(Class Object)。...在Objective-C中,类也是用对象来表示的,而类的isa指针指向它的metaclass(存储静态成员变量和类方法)。 super_class指针:指向父类。 name:类名称。...info:运行期使用的标志位,比如0x1(CLS_CLASS)表示该类为普通class,0x2(CLS_META)表示该类为 metaclass。...7、isa 指针 isa 指针是当你向对象发送消息时,Objective-C Runtime 检查一个对象并且查看它的类是什么然后开始查看它是否响应这些 selectors 所需要的一切。...更确切地说,id是指向Class类型的指针,而Class又是指向struct objc_class结构的指针。
今年,Apple 给 Objective-C Runtime 带来了新的优化,接下来,让我们深入理解这些变化。...我们可以通过分离出永不更改的数据部分,将大多数类数据保留为Clean Memory,如何怎么做的呢? 在介绍优化方法之前,我们先来看一下,在类加载之后,类的结构会变成如何呢?...事实证明,class_rw_t会占用比class_ro_t占用更多的内存,在 iPhone 中,我们在系统测量了大约 30MB 的这些class_rw_t结构。应该如何优化这些内存呢?...Tips:Advances in Objective-C 在我们查看对象指针时,在 64 位系统中,我们会看到 16 进制地址如0x00000001003041e0,我们把它转换为二进制表示如下图 [image...设置为 0 则表示为正常的对象 [image] 在设置为 1 表示为 Tagged Pointer 对象之后,在最低位之后的 3 位,我们给他赋予类型意义,由于只有 3 位,所以它可以表示 7 种数据类型
在 WWDC2020 中 Objective-C 运行时的改进这个视频提到关于类的的数据结构的一些变化,本文是对这个视频提到的部分变化进行翻译。...视频中介绍了三个变化: 首先是数据结构的变化, Objective-C 运行时会使用它们来追踪类。 其次是 Objective-C 方法列表的变化。...我们只在一个真正的对象指针中 使用了中间的这些位。 由于对齐要求的存在 低位始终为 0 对象必须总是位于 指针大小倍数的一个地址中。...0 的位中 选择一个位并把它设置为 1,这可以让我们立即知道 这不是一个真正的对象指针 然后我们可以给其他所有位 赋予一些其他的意义 我们称这种指针为 tagged pointer。...例如 我们可以在其他位中塞入一个数值 只要我们想教 NSNumber 如何读取这些位 并让运行时适当地处理 tagged pointer 系统的其他部分就可以 把这些东西当做对象指针来处理 并且永远不会知道其中的区别
其实,所谓 Block 就是 Objective-C 对象。 id 这一变量类型用于存储 Objective-C 对象。...在 Objective-C 源代码中,虽然可以像使用 void *类型那样随意使用 id, 但此 id 类型也能在 C 语言中声明。...在 runtime.h 声明如下: typedef struct objc_object { Class isa; } *id; id 为 objc_object 结构体的指针类型...然后再看下 Class typedef struct objc_class *Class; Class 为objc_class 结构体 的指针类型。...到此,我们已经了解 Block 的实质,知道 Block 即为 Objective-C 的对象了。
实例,来保存每个对象的 weak 指针列表,因为每个对象可能有多个 weak 指针,所以这个实例的值是 CFMutableSet 类型。...在设计之初,二者都是作为 C 语言的面向对象的接班人,希望成为事实上的标准。最后结果大家都知道了,C++ 最终胜利了,而 Objective-C 在之后的几十年中,基本上变成了苹果自己家玩的玩具。...next 方法,在 next 方法的实现逻辑中,我们需要: 判断栈是否为空,如果为空则返回 nil。...从栈中取出元素,看是否遍历到了结尾,如果是的话,则出栈。 判断第 2 步是否使栈为空,如果为空,则返回 nil。 终于拿到元素了,这一步判断拿到的元素是否是数组。...题目 11:Objective-C 对象内存结构中的 isa 指针是用来做什么的,有什么用? Objective-C 是一门面向对象的编程语言。每一个对象都是一个类的实例。
那么Objective-C运行时是如何根据一个对象实例来找到方法签名表,再找到要执行的方法呢,看似麻烦的事情其实原理也非常简单,细心观察,你会发现所有的NSObject子类对象中都包含一个isa成员变量...需要注意,使用LLDB调试器我们是可以拿到对象的isa指针的,并且可以看出它的确为Class类型,但是我们缺无法通过isa指针继续向下取抓取更多类的信息,其所在的内存是禁止我们访问的。...,第一个参数为Class对象,第二个参数为方法选择器,第三个参数为IMP类型的函数指针,第四个参数为指定方法的返回值和参数类型。...这个参数采用的是C字符串的形式来指定返回值和参数的类型,第1个字符为返回值类型,其后都为参数类型,需要注意,使用这种方式添加方法的时候系统会默认传入两个参数,分别是调用此方法的实例对象和方法选择器,上面示例代码中的...,types需要设置为C风格的字符数组,即C字符串,其中第1个字符表示返回值类型,其余字符依次表示参数类型,参数类型与字符的映射表如下: ?
众所周知,Objective-C 是一种运行时语言。运行时怎么来体现的呢?比如一个对象的类型确定,或者对象的方法实现的绑定都是推迟到软件的运行时才能确定的。...以下内容部分摘录自: 王巍 (@onevcat) 的 深入Objective-C的动态特性 Bang 的如何动态调用 C 函数 如果你觉得看的不尽兴,可以去看下这两篇文章。...与之相似的为 -isKindOfClass:,可以用以确定某个对象是否是某个类或其子类的成员。这两个方法为典型的introspection方法。...在继续之前,需要明确Objective-C中消息的概念。...]中新加入返回为void的实现,SEL名字为aSEL,实现的具体内容为dynamicMethodIMP class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP
从上述源码中,我们可以看到,Objective-C 对象都是 C 语言结构体实现的,在objc2.0中,所有的对象都会包含一个isa_t类型的结构体。...objc_class继承于objc_object。所以在objc_class中也会包含isa_t类型的结构体isa。至此,可以得出结论:Objective-C 中类也是一个对象。...objc_object里面的isa是isa_t类型。通过查看源码,我们可以知道isa_t是一个union联合体。...我们知道,对象的指针大小一般是与机器字长有关,在32位系统中,一个指针的大小是32位(4字节),而在64位系统中,一个指针的大小将是64位(8字节)。...has_assoc 对象含有或者曾经含有关联引用,没有关联引用的可以更快地释放内存 has_cxx_dtor 表示该对象是否有 C++ 或者 Objc 的析构器 shiftcls 类的指针。
运行时系统作为Objective-C语言的一种操作系统来使得Objective-C工作的。 本文档查看NSObject类以及Objective-C程序如何与运行时系统交互。...对象的变量中的第一个是指向其类结构的指针。 这个名为isa的指针为对象提供对其类的访问权限,并通过类访问所有从它继承的类。...methodForSelector:返回的指针必须小心转换为正确的函数类型。 转换中应包含返回类型和参数类型。...Objective-C方法只是一个C函数,它至少需要两个参数self和_cmd。 您可以使用函数class_addMethod将函数添加到类中。...动态加载 Objective-C程序可以在运行时加载和链接新的class和category。新的代码被合并到程序中,并在开始时加载class和category。
同时,在Objective-C语言中,类本身也是一个对象,类作为对象时isa指针指向元类(Meta Class),后面会详解; super_class:指向该类的父类,如果该类已经是根类(NSObject...我们常见的id是一个struct objc_object类型的指针。id类型的对象可以转换为任何一种类型的对象,它的作用有点类似 C 语言中的 void * 指针类型。...(Ivar); class_getClassVariable函数,目前没有找到关于Objective-C中类变量的信息,一般认为Objective-C不支持类变量。...在 Objective-C 中,为了协助 Runtime 系统,编译器会将每个方法的返回值和参数列表编码为一个字符串,这个字符串会与方法对应的 selector 关联。...测试使用的栗子(Demo)都在篮子里 参考 Objective-C Runtime的数据类型 What's the difference between doing alloc and class_createInstance
Objective-C 是苹果为 iOS 和 Mac 开发量身定制的语言。它随着 iPhone 的出现而大火,直到今天国内外大多数的 App 依然是用 Objective-C 在写。...看名字我们可以知道,它与 C 语言有千丝万缕的联系,事实上也确实如此:Objective-C 是 C 语言的超集,它在 C 语言主体上加上了面向对象的特性。...现在的面试中,传统大厂如 BAT 对 Objective-C 的语言进行较多考察,日常开发也是以 Objective-C 为主。...而所谓 block,就是 Objective-C 对于闭包的实现。闭包就是没有名字的函数,或者理解为指向函数的指针。 7.什么是 block?它和代理的区别是什么?...== 这个符号判断的不是这两个值是否相等,而是这两个指针是否指向同一个对象。如果要判断两个 NSString 是否值相同,平时开发应该用 isEqualToString 这个方法。
我们知道在Objective-C中,使用[object doSomething]语法并不会马上执行object接受者对象的doSomething方法的代码,而是向object接受者对发送一条doSomething...Class 从源文件看出,Objective-C的对象就是一个包含isa指针的数据结构,而isa指针的数据类型是Class,Class表示对象所属的类。 ?...objc_class结构体定义如下: isa:在Objective-C中,所有的类自身也是一个对象,即类对象。在这个类对象里面也有一个isa指针,它指向metaClass(元类)。...元类(Meta Class) 在Objective-C中,所有的类自身也是一个对象,这个对象里面也有一个isa指针,它指向metaClass(元类),向这个对象发送消息(即调用类方法)。 ?...Objective-C的设计者让所有的meta-class的isa指向基类的meta-class,以此作为它们的所属类。
Objective-C的runtime是一个「运行时库」,为OC这门语言提供动态的特性,所有OC应用程序都与之相关联。...名词解释 isa isa是一个指针,隐式地存在于实例对象、类中,对象的isa指针指向所属类——因此实例对象能知道自己属于哪个类;类的isa指针指向一个叫「元类(Meta Class))」的玩意儿。...解读一下部分成员: isa指针 上面介绍isa的时候,说过类也有一个isa指针,我们可以理解为:类本身也是一个对象——「类对象」。...是「元类(Meta Class)」的实例(每个类的isa指针指向元类)。 我们熟知的「类方法」,也可以理解为是「类对象」的实例方法。...typedef struct objc_cache *Cache OBJC2_UNAVAILABLE; Cache的存在,是为方法调用时的性能优化:实例对象收到消息后,会先从Cache中查找,看是否有方法的实现
领取专属 10元无门槛券
手把手带您无忧上云