__weak Person *person; __unsafe_unretained Person *person;
nslog(111)
{
Person *person = [Person alloc]init];
person3 = person;
}
nslog (2222 %@ , person3)
__weak 相对于 __unsafe_unretained 更安全
对象销毁 所有指向objc 的 weak指针会销毁 进入 obj -> clearweakself;
sideTable {
weak_table_t; //散列表
}
ARC LLVM 编译器和僧成 releace + runtime 清除 弱引用 协作
autorelesePool {
释放时机//
Person *person = [Person alloc]init] autorelease];
离开 大括号 就销毁
}
struct __AtAutoreleasepool {
__at_autoreleasepool() {// 构造函数在创建结构体的时候 调用
atautoreleasepoolobject = objc_autoreleasepoolPush();
}
__at_autoreleasepool() {// 在结构体销毁的时候调用
atautoreleasepoolobject = objc_autoreleasepoolPush();
}
void * atautoreleasepoolobj;
}
基础类 __AtAutoreleasepool 和 __AtAutoreleasepoolpPage ;
__AtAutoreleasepoolpPage 占用 4096 字节 存放自己的成员变量 和 4040被autorelease 标记的对象
所有的 autolease 对象 通过双向链表的 方式 实现
因为 可能有多个 AtAutoreleasepoolpPage 所以需要通过双向链表的方式实现
// 卡顿优化
使用轻量级的对象 能用int 尽量不用NSNumber , 用不到处理事件的地方可以用calayer
不要频繁的调用UIView 相关的属性, frame bounds, transform 尽量减少不必要的修改
提前计算好布局 不要多次修改属性
控制线程的最大并发数量
尽量吧耗时的操作放到子线程
尽量减少视图的层次和数量
避免短时间大量的图片的侠士
GPU 最大能处理的纹理尺寸是 4096 * 4096 超过这个尺寸就逍遥占用cpu进行处理
尽量减少 离屏渲染
比较耗费资源的话会在当前屏幕缓冲区之外创建新的缓冲区进行渲染操作
监听