app
SuperChaoXu
这个作者很懒,什么都没留下…
展开
-
_ _ block的内存管理
当block在栈上时,并不会对_ _ block变量产生强引用 当block被copy到堆时 会调用block内部的copy函数 copy函数内部会调用_Block_object_assign函数 _Block_object_assign函数会对_ _ block变量形成强引用(retain) 当block从堆中移除时 会调用block内部的dispose函数 dispose函数内部会调用_Block_object_dispose函数 _Block_object_dispose函数会原创 2022-01-18 18:59:46 · 480 阅读 · 0 评论 -
面试题-Block
block的原理是怎么样的? 本质是什么? 封装了函数调用以及调用环境的OC对象 __block 的作用是什么? 有什么使用注意点? block的属性修饰符为什么是copy? 使用block有哪些使用注意? block一旦没有进行copy操作,就不会在堆上 使用注意:循环引用的问题 block在修改NSMutableArray,需不需要添加__block? block本质上也是一个OC对象,它内部也有个isa指针 block是封装了函数调用以及函数调用环境的OC对象 block的底层结构如原创 2022-01-18 17:48:47 · 128 阅读 · 0 评论 -
思考:如何实现给分类“添加成员变量”? objc_AssociationPolicy的原理
默认情况下,因为分类底层结构的限制,不能添加成员变量到分类中。但可以通过关联对象来间接实现 关联对象提供了以下API 添加关联对象 void objc_setAssociatedObject(id object, const void * key, id value, objc_AssociationPolicy policy) 获得关联对象 id objc_getAssociatedObject(id object, const void * key) 移除所有的关联对象 void ob原创 2022-01-18 12:27:54 · 250 阅读 · 0 评论 -
category的面试题和底层结构
Category的使用场合是什么? Category的实现原理 Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息 在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象、元类对象中) Category和Class Extension的区别是什么? Class Extension在编译的时候,它的数据就已经包含在类信息中 Category是在运行时,才会将数据合并到类信息中 Categ原创 2022-01-18 12:18:33 · 110 阅读 · 0 评论 -
RunLoop对象与线程
iOS中有2套API来访问和使用RunLoop 1.Foudation: NSRunLoop 2.Core Foudation:CFRunLoopRef NSRunLoop和CFRunLoopRef都代表着RunLoop对象 NSRunLoop是基于CFRunLoopRef的一层OC包装 CFRunLoopRef是开源的 https://opensource.apple.com/tarballs/CF/ 每条线程都有唯一的一个与之对应的RunLoop对象 RunLoop保存在一个全局原创 2022-01-18 11:58:41 · 219 阅读 · 0 评论 -
什么是RunLoop
顾名思义 运行循环 在程序运行过程中循环做一些事情 应用范畴 定时器(Timer)、PerformSelector GCD Async Main Queue 事件响应、手势识别、界面刷新 网络请求 AutoreleasePool 如果没有RunLoop 如果有了RunLoop ...原创 2022-01-18 11:37:29 · 1697 阅读 · 0 评论 -
KVC笔记
KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性 常见的API有 - (void)setValue:(id)value forKeyPath:(NSString *)keyPath; - (void)setValue:(id)value forKey:(NSString *)key; - (id)valueForKeyPath:(NSString *)keyPath; - (id)valueForKey:(NSString *)key; .原创 2022-01-17 23:26:07 · 1110 阅读 · 0 评论 -
KVO、KVC的面试题
iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类 当修改instance对象的属性时,会调用Foudation的_NSSetXXXValueAndNotify函数 willChangeValueForKey: 父类原来的setter didChangeValueForKey: 内部会触发监听器(Oberser)和监听方法(observeValueForKeyPath:ofObject:原创 2022-01-17 23:20:37 · 598 阅读 · 0 评论 -
KVO的笔记
KVO的全称是Key-Value Observing, 俗称“键值监听”,可以用于监听某个对象属性值的改变 未使用KVO监听的对象 使用了KVO监听的对象,创建了子类,instance对象的isa指针指向新的子类 _NSSet*ValueAndNotify的内部实现 调用willChangeValueForKey: 调用原来的setter实现 调用didChangeValueForKey: didChangeValueForKKey:内部会调用observer的observe.原创 2022-01-17 23:05:06 · 1348 阅读 · 0 评论 -
class、meta-class的本质结构
原创 2022-01-17 21:56:57 · 224 阅读 · 0 评论 -
OC关于isa指针的一些总结
instance的isa指向class 当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用 class的isa指向meta-class 当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用 class对象的superclass指针 当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class...原创 2022-01-17 21:53:23 · 121 阅读 · 0 评论 -
meta-class的记录
objectMetaClass是NSObject的meta-class对象(元类对象) 每个类在内存中有且只有一个meta-class对象 meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括 isa指针 superclass指针 类的类方法信息(class method) ...... ...原创 2022-01-17 21:47:36 · 94 阅读 · 0 评论 -
Class的记录
objectClass1~objectClass5都是NSObject的class对象(类对象) 它们是同一个对象。每个类在内存中有且只有一个class对象 class对象在内存中存储的信息主要包括 isa指针 superclass指针 类的属性信息(@property)、类的对象方法信息(insatnce method) 类的协议信息(protocol)、类的成员变量信息(ivar) ...... ...原创 2022-01-17 21:39:52 · 175 阅读 · 0 评论 -
OC对象的本质
我们平时编写的Objective-C代码,底层实现其实都是C\C++代码 Objective-C中的对象,简称OC对象,主要可以分为3种 1.instance对象(实例对象) 2.class对象(类对象) 3.meta-class对象(元类对象) 一个NSObject对象占用多少内存? 系统分配了16字节给NSObject对象(通过malloc_size函数获得) 但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_get...原创 2022-01-17 21:02:37 · 1113 阅读 · 0 评论 -
synthesize关键字的说明
iOS6之后LLVM编译器引入了property autosynthesis, 即属性自动合成。换句话说,就是编译器会为每个@property添加@synthesze, 如以下形式 : @synthesize propertyName = _propertyName; 这行代码会创造一个带下划线的实例变量名,同时使用这个属性生成getter和setter方法。 使用@synthesize 只有一个目的-给实例变量起个别名,或者说为同一个变量添加两个名字。 如果要阻止自动合成,记得使用@dynamic原创 2021-05-11 17:21:57 · 250 阅读 · 0 评论