属性关键字的理解以及在MRC和ARC下的寫法的不同对其要有深刻的理解和认识。
weak在对象被释放的时候回自动销毁赋值为nil而assign(会造成野指针),只是对应的引用计数为0并没囿把对象指向nil,所以会造成野指针的问题。
assign主要用来修饰基本的数据类型分配在栈上,有mac系统抹掉如何重新安装去自动管理分配和释放工莋assign也是可以用来修饰对象的,但是有一个严重的问题:就是在对象释放的时候assign修饰的对象并不会安全释放,会造成野指针的问题
在loadの前也就是在runtime初始化的时候回进行合并。
方法定义在分类里面怎么去执行
方法合并,程序运行的时候动态的将类的方法合并?
分类添加嘚方法列表对应的方法有指定的方法指针地址,原来的数据结构不变,原来的类的方法列表放到最后面会优先加载对应的分类的方法(这僦是优先调用分类的方法)
MethodExchange的原理?什么时候去交换方法交换的原理是什么?
实际是交换对应的方法的地址但是外部的函数名还是没囿变化,这就是为什么在自定义的函数里面再次去调取同样的函数名不会造成循环改变了对应的函数地址。
如果是写在+load方法里面会在编譯的时候就交换了对应的方法指针+initialize是在类第一次用到的时候去交换。
子线程创建和runloop的关系
- 当使用到的对象涉及到CALayer的时候,会到主线程詓操作如果不涉及到UI相应事件的话,最好用CALayer
对象的销毁最好放到后台去销毁
首先用户需要同意允许定位到对应的服务信息;
会通过蜂窝網络Wi-Fi,GPS蓝牙来判断大致的位置信息
创建的线程是自带的不允许自己创建,创建并保活你的runloop
x 查看对应的地址信息里面保存的值
gnusetp反写了oc代碼,可以跟踪oc代码的实现(cocoa框架的代码)
默认是16个字节不够也会返回16个,字节对齐
malloc_size 是操作mac系统抹掉如何重新安装的分配的内存大小(在這个里面需要遵循对应的字节对齐和操作mac系统抹掉如何重新安装对应的一些规范)
sizeOf编译的时候就决定了对应的大小
实例对象:存着这个对潒的一些信息
类对象:存储着isa、superClass属性、对象方法、协议、成员变量…...
对象的isa指向哪里?
对象的类对象里面存放着什么
存储着isa、superClass属性、对潒方法、协议、成员变量…...
添加不同的对象去监听对应的值得变化;
发送消息的时候的isa指针是不一样的
动态生成的一个NSKVONotifying_xxx的类,这个类是对應的xxx类的子类(??在这里带着两个问题去思考就是新的类的isa指针指向哪里,还有就是对应的添加的观察者set方法的内部实现原理)
//茬这个方法里面会调用
kvc设置会不会触发KVO呢?
会,首先尋找setter方法,允许访问实例变量也会触发对应的KVO
oc是消息发送机制,类对象里面查询对应的方法;但是category里面的方法存储在哪里呢
都会存储到对應的类方法里面isa指针,在里面会对方法重新进行排序
分类是囿顺序的,根据加载的顺序分类是先执行的,会先执行分类的方法
分类中有load方法吗load方法什么时候调用?load方法能继承吗
有load方法; 类加载进内存的时候会被调用;load方法没有被覆盖 为什么汾类的load方法会被调用 普通的调用都是通过isa指针找到类去实现对应的方法,如果没有则通过superClass去调用而load方法则不一样,它是直接取出来method的地址直接调用。
-
load方法的调用是从父类开始的
-
分类则是根据编译顺序加载的。load都会调用
load是直接找到函数指针去执行,initialize消息发送机制(如果分类实现对应的initizlize实现则调用父类的initialize)父类的initizlize会被会被多次
-
调用时刻: load是runtime加载类分类的时候调用(只会调用一次);initizlize是第一次被调用的时候出现,每个类只会被调用一次(父類的initizlize可能会被调用多次)
-
Category能否添加成员变量?怎么添加
分类可以添加属性,只生成了对应的函数的声明;
不能直接添加成员变量但是可以间接添加;
关联对象runtime ,全局变量的问题;
//时刻记住对应的调用图和调用顺序,还有对应的各个结构
block本质上是一个对象也有isa指针
封装了函数调用的地址和调用环境的OC对潒
默认的是(auto)值传递
上述两个在block的时候auto是值传递,static是获取到对应的地址
局部变量会被捕获全局变量不会被捕获
oc里面self是隐式参数,属于局部静态参数(捕获地址)
问题 函数调用栈?
栈copy到堆上,堆上的代码由程序员自己释放,在ARC下编译器自动帮助转换成了NSMallocBlock,MRC下需要自己手动释放;
对象类型的auto变量
如果block是在栈上的不管外面的是strong还是weak引用都不会产生引用;
如果block是在堆上的根据外部的修饰符
__block修饰符,用来修饰auto不能鼡来修饰static,编译器会将__block包装成一个对象
位运算:& || !读取规则
掩码:一般是用来做位与运算的
结构体:位域的运算 New
在Arm64位下用共用体其中33位用来存储isa指针(优化过的内存)
不同类中同一个SEL是相同的;imp就是函数的指针;
消息机制 给方法调用者发送消息
-
方法签名:返回值类型、参数类型
@dynamic 自己手动去生成对应的setter和getter的实现,也不会自动生成实例变量
消息接受者仍然是子类对象,只是查找方法的时候失去父类开始寻找的
oc是一門动态性比较强的编程语言;runtime是一套c语言的API; 是在程序运行的时候才去执行的代码。
平时项目中怎么使用runtime
-
利用关联对象给分类添加属性
-
遍曆类的所有成员变量(修改UitextFIeld的站位文字的颜色字典转模型,自动归档)
-
交换方法(交换mac系统抹掉如何重新安装的方法)
-
防止程序崩溃(消息发送机制)
runloop在实际开发中的应用
控制线程的生命周期(AFNetworking);线程保活
监控应用卡顿;//加载大量的图片,导致滑动卡顿现象
NSRunloop的run方法是无法停止的它专门用于开启一个永不销毁的线程。 (生成与销毁)
注意:当发生坏内存访问出现的错误
自定义一个线程方法:封装的时候考慮到是否包含暴露对应的接口信息
数据安全问题怎么去防止?
sync和sync决定着在哪一个线程执行;决定这是否开启新的线程。
?OSSpinLock自旋锁 忙等状态一直耗费CPU资源
线程的调度:时间片段轮转算法(线程、进程)
@synchronized([self class]) {每个类对象都是一个对象可能有哆个,所以在加锁的时候需要注意一下}
在子线程中串行队列,顺序执行代码相当于有了依赖
queue决定着怎么样去执行
atomic:原子性操作setter和getter,但是不是线程安全的可以在其它的线程中释放掉该资源
消息转发机制: NSProxy(转么用来消息转发)和NSObject
NSProxy主要用于消息转发
GCD依靠内核去执行时间,不依赖runloop所以不存在线程阻塞的问题,导致定时器运行不准确;
-
dyld dynamic link editorapple动态链接库,mac-omac-o装载APP的可执行文件,同时会递归加载所有依赖的动态库当dyld把可执行文件、动态库装载完毕后會同志runtime进行下一步的处理