,需手动实现;不声明实例变量,因为它是类变量;【iOS 10, Xcode 8】 空类 nonnull 不能为空【iOS 9, Xcode 7】 —— nullable 可以为空【iOS 9, Xcode...属性访问方式 访问的方式有: 通过直接使用实例变量 使用编译器提供的点运算符,实现属性存取方法的调用,从而间接使用实例变量; 注意:id 类型的变量不能使用点操作符进行访问,原因是 Xcode 不知道是否存在对应的存取方法...,属性的错误就可以修复了; 当然 age 那个错误可以直接忽略,因为压根就不会有它的出现; 当然如果只手动做一个方法的实现: ?...类属性关键字解析【 OC 新增】 class 关键字是表示定义的变量是类变量,就是元类的变量; 那么相应地,它的存取方法当然就是类方法了; 它永远不会自动合成,所以类变量、类存取方法,都要自己手动实现;...* * @return 是一个 C 类型的指针数组 * 其它采纳了此协议的协议里面的属性声明不会包含在这里.
of `struct objc_class *` */ 这个结构体,包括:isa指针、父类指针、类名、成员变量、方法列表、缓存以及协议列表等。...; objc_method结构体存储了方法名、方法类型和方法实现。...Method:表示一个方法,本质是一个指向objc_method结构体的指针。 SEL(Selector):在运行时用来代表一个方法的名字。...而super不是隐藏参数,是一个「编译器标示符」,它告诉编译器,调用父类的方法,而不是本类的方法。但是,这时候实际上的消息的接收者,还是self。...in categories 但是可以为Category添加属性,也可以自定义setter、getter,外部也可以访问;但是,这个属性是无意义的,因为不能保存数据(可以返回值,但是不能赋值)。
objc_class { struct objc_class *isa; //指向该对象所属类型的类型对象(Class Object),而类的isa指针指向它的metaclass...标志位的不同可能指向不同,比如可能指向实例方法列表,或者指向类方法列表 struct objc_cache *cache; //因为Objective-C的消息转发需要查找dispatch...通过这种方法来模拟生成属性,但是与对象还是有点区别,因为对象属性会编译器自动生成setter和getter方法,会默认给你生成一个以下划线开头的成员变量,而category不手动去生成setter和getter...当Objective-C编译器去处理实现一个方法的时候,就会指向一个IMP对象,这个对象是C语言表述的类型。...:获取协议列表 class_addIvar:添加成员变量(添加成员变量只能在运行时创建的类,且不能为元类) class_addProperty:添加属性 class_addMethod:添加方法 class_addProtocol
以上你可能看不出它的价值,但是我们需要了解的是 Objective-C 是一门动态语言,它会将一些工作放在代码运行时才处理而并非编译时。...① 类 类对象(Class)是由程序员定义并在运行时由编译器创建的,它没有自己的实例变量,这里需要注意的是类的成员变量和实例方法列表是属于实例对象的,但其存储于类对象当中的。...objc_class *Class; 可以看到类是由Class类型来表示的,它是一个objc_class结构类型的指针。...Objective-C的类方法是使用元类的根本原因,因为其中存储着对应的类对象调用的方法即类方法。...需要注意的是,指针可能是NULL,表示这个缓存bucket没有被占用,另外被占用的bucket可能是不连续的。这个数组可能会随着时间而增长。
, 返回NO表示是NSObject的子类 - (BOOL)isProxy; //判断是否为该类的成员, 或者是否派生自该类的成员 - (BOOL)isKindOfClass:(Class)aClass...现在看到区别了吧, 以id类型返回的对象, 编译器无法识别出他的成员变量或者方法....); // 输出:Person Class isa: 需要注意的是在Objective-C中,所有的类自身也是一个对象,这个对象的Class里面也有一个isa指针,它指向metaClass(元类) 元类对象...id是一个objc_object结构类型的指针,这个类型的对象能够转换成任何一种对象。...ObjC 的特性是允许对一个 nil 对象执行任何一个方法不会 Crash,因为会被忽略掉。
} OBJC2_UNAVAILABLE; 在Objective-C中类是由Class表示的,Class是一个指向struct objc_class的指针。...这个数组可能包含不超过mask+1个元素。需要注意的是,指针可能是NULL,表示这个缓存bucket没有被占用。另外被占用的bucket可能是不连续的。这个数组可能会随着时间而增长。...我们常见的id是一个struct objc_object类型的指针。id类型的对象可以转换为任何一种类型的对象,它的作用有点类似 C 语言中的 void * 指针类型。...如果变量的类型是指针类型,则传递log2(sizeof(pointer_type)); class_copyIvarList函数,它返回一个指向成员变量信息的数组,数组中每个元素是指向该成员变量信息的objc_ivar...一个Objective-C方法是一个简单的C函数,它至少包含两个参数self和_cmd。
在本文中,着重讲解一下类实现细节的先关内容,主要包括类中的成员变量、属性、方法以及协议与分类的实现。 在讲解成员变量与属性之前,需要了解一下类型编码相关知识。...类型编码 在Runtime中,编译器将每个方法的返回值和参数类型编码为一个字符串,并将其与方法的selector关联在一起。...需要注意的是这些类型很多是与我们用于存档和分发的编码类型是相同的。但有一些不能在存档时使用,如下所示: 注意:Objective-C不支持long double类型。...基础数据结构 成员变量(Ivar)的数据结构 在Objective-C中,成员变量即Ivar类型,是指向结构体struct objc_ivar的指针,在Objc/runtime.h 中查到,如下所示:...这里有几点需要注意的: 我们不能用 class_addIvar() 函数为一个已经存在的类添加Ivar,并且 class_addIvar() 只能在 objc_allocateClassPair() 和
objc_protocol_list *protocols; }; 可以看到Objective-C对象系统的基石:struct objc_class结构如下: isa指针:指向该对象所属类型的类型对象...在Objective-C中,类也是用对象来表示的,而类的isa指针指向它的metaclass(存储静态成员变量和类方法)。 super_class指针:指向父类。 name:类名称。...cache:因为Objective-C的消息转发需要查找dispatch table甚至可能需要遍历继承体系,所以缓存最近使用的方法。 protocols:类需要遵守的协议。...7、isa 指针 isa 指针是当你向对象发送消息时,Objective-C Runtime 检查一个对象并且查看它的类是什么然后开始查看它是否响应这些 selectors 所需要的一切。...更确切地说,id是指向Class类型的指针,而Class又是指向struct objc_class结构的指针。
五、可选类型 在Objective-C开发中,如果一个变量暂时不会使用到,可以将它赋值为0或者赋值为空,而在swift中,nil是一个特殊的类型,如果它和真实类型不匹配是不能进行赋值的。...在前面的教程中提到过,不同类型的值是不能直接运算的。而可选项有两种值的产生,若它的值为nil则不能参加计算。 因此引入解包的概念,“!”代表强制解包。它的意思是从可选值中强行获取对应的非空值。...2、表示区间 swift常见区间有两种,开区间用..表示,闭区间用...表示。要注意的是数字和省略号之间是不能加空格的。...绝对不能用相加的方式对字典进行合并。...因为它没有考虑到枚举类的全部成员。如果说不需要匹配所有的枚举成员,可以提供一个default分支来涵盖其他未明确处理的枚举成员。
SEL objc_msgSend函数第二个参数类型为SEL,它是selector在Objc中的表示类型(Swift中是Selector类)。...PS:isa指针不总是指向实例对象所属的类,不能依靠它来确定类型,而是应该用class方法来确定实例对象的类。...; 可以看到运行时一个类还关联了它的超类指针,类名,成员变量,方法,缓存,还有附属的协议 PS:OBJC2_UNAVAILABLE之类的宏定义是苹果在 Objc 中对系统运行版本进行约束的黑魔法,为的是兼容非...,而不包含成员变量。...结果是 NO ,尽管它能够接受 negotiate 消息而不报错,因为它靠转发消息给 Diplomat 类来响应消息。
每一个对象 都有一个名为isa的指针,指向该对象的类。 每一个类都描述了一系列它的实例的特点,包括成员变量的列表,成员函数的列表等。...(图中除了isa外还有其它成员变量,但那是为了兼容非2.0版的Objective-C的遗留逻辑,大家可以忽略它。)...另外,需要注意的是,我们从集合对象(collection)中获取的对象,通常会用到这两个查询类型信息的方法。因为从集合对象中取出来的对象不是强类型的(strongly typed),其类型通常是id。...回想一下,我们从一个数组中取出来的对象,其返回值是id类型的。这就是为什么我们可以在这个取出来的对象身上通过中括号”[ ]”的形式调用任何方法,却不能通过点语法来调用方法。...若是如此,那就应该使用==操作符,而不要使用比较Objective-C对象使常用的“isEqual:”方法。因为==操作符比较的是指针是否相等,也就是比较内存地址是否相同。
遗留下来的“传统”,在 MRC 中,方法内部的 block 是在栈区的,使用 copy 可以把它放到堆区.在 ARC 中写不写都行:对于 block 使用 copy 还是 strong 效果是一样的,...这个类是 NSString 的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。...这个类是 NSString 的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。...第二个成员是 (id)class_getSuperclass(objc_getClass(“Son”)) , 实际该函数输出结果为 Father。...类方法: 类方法是属于类对象的 类方法只能通过类对象调用 类方法中的self是类对象 类方法可以调用其他的类方法 类方法中不能访问成员变量 类方法中不定直接调用对象方法 实例方法: 实例方法是属于实例对象的
另外,还关联了它的类名,成员变量列表,方法列表,缓存,还有附属的协议。 ...这里我们注意第三个成员ivar_offset。它表示基地址偏移字节。...这个数组可能包含不超过mask+1个元素。需要注意的是,指针可能是NULL,表示这个缓存bucket没有被占用,另外被占用的bucket可能是不连续的。这个数组可能会随着时间而增长。 ...结果是 NO ,尽管它能够接受 negotiate 消息而不报错,因为它靠转发消息给Diplomat 类来响应消息。 ...9.1 类本质 OC中类的本质其实就是“结构体+函数指针”的组合,当然,对于NSObject而言,首先它只是包含一个objc_class类型的成员isa,而objc_class是一个结构体类型
说 Swift 是函数式编程语言,是因为 Swift 支持 map, reduce, filter, flatmap 这类去除中间状态、数学函数式的方法,更加强调运算结果而不是中间过程。 10....他们遵循的基本原则是:高级别的变量不允许被定义为低级别变量的成员变量。比如一个 private 的 class 中不能含有 public 的 String。...与 Open 唯一的区别在于它修饰的对象可以在任意 Module 中被访问,但不能重写。 Internal 是默认的权限。...先给出两种解决方案: 在协议和方法前都加上 @objc 关键字,然后再在方法前加上 optional 关键字。该方法实际上是把协议转化为Objective-C的方式然后进行可选定义。...协议的命名(例如Shakeable)直接可以确定其实现的UIButton拥有相应shake功能;通过协议扩展,可以针对不同类实现特定的方法,可维护性也大大提高;因为协议扩展通用于所有实现对象,所以代码复用性也很高
每一个对象内部都有一个isa指针,这个指针是指向它的真实类型 根据这个指针就能知道将来调用哪个类的方法 下面的代码输出什么?...类方法 1 类方法是属于类对象的 2 类方法只能通过类对象调用 3 类方法中的self是类对象 4 类方法可以调用其他的类方法 5 类方法中不能访问成员变量 6 类方法中不能直接调用对象方法 7 类方法是存储在元类对象的方法缓存中...注意:这个函数的第一个参数queue不能是全局的并发队列 作用:在它前面的任务执行结束后它才执行,在它后面的任务等它执行完成后才会执 示例代码 -(void)barrier { dispatch_queue_t...是print-object的简写 expr:可以在调试时动态执行指定表达式,并将结果打印出来,很有用的命令 print:也是打印命令,需要指定类型 bt:打印调用堆栈,是thread backtrace...在Objective-C中向nil发送消息是完全有效的——只是在运行时不会有任何作用 如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil) 如果方法返回值为指针类型,其指针大小为小于或者等于
ivars是objc_ivar_list成员变量列表的指针;methodLists是指向objc_method_list指针的指针。*methodLists是指向方法列表的指针。...在objc_class中,除了isa之外,还有3个成员变量,一个是父类的指针,一个是方法缓存,最后一个这个类的实例方法链表。...对象的实例方法调用时,通过对象的 isa 在类中获取方法的实现。 类对象的类方法调用时,通过类的 isa 在元类中获取方法的实现。 meta-class之所以重要,是因为它存储着一个类的所有类方法。...里面包含3个成员变量。SEL是方法的名字name。types是Type Encoding类型编码,类型可参考Type Encoding,在此不细说。 IMP是一个函数指针,指向的是函数的具体实现。..._cmd表示当前调用方法,其实它就是一个方法选择器SEL。 难点一,能不能调用speak方法?
注意:isa 指针在代码运行时并不总指向实例对象所属的类型,所以不能依靠它来确定类型,要想确定类型还是需要用对象的 -class 方法。...; 从 objc_class 可以看到,一个运行时类中关联了它的父类指针、类名、成员变量、方法、缓存以及附属的协议。...Ivar Ivar 是表示成员变量的类型。...我们可以实现 forwardInvocation: 方法来对不能处理的消息做一些处理。也可以将消息转发给其他对象处理,而不抛出错误。 注意:参数 anInvocation 是从哪来的?...只有苹果将父类改为以前的布局才能拯救我们,但这样导致它们不能再拓展它们的框架了,因为成员变量布局被固定住了。
id objc_msgSend方法里面的第一个参数的数据类型id,通用类型指针,能够表示任何对象。 ?...Class 从源文件看出,Objective-C的对象就是一个包含isa指针的数据结构,而isa指针的数据类型是Class,Class表示对象所属的类。 ?...instance_size:该类的实例变量大小。 ivars:该类的成员变量链表。 methodLists:方法定义的链表。 protocols:协议链表。...SEL objc_msgSend函数第二个参数类型为SEL,它是selector在Objc中的表示类型(Swift中是Selector类)。...Method Method是一种代表类中的某个方法的类型。 ? Paste_Image.png 而objc_method在上面的方法列表中提到过,它存储了方法名,方法类型和方法实现: ?
领取专属 10元无门槛券
手把手带您无忧上云