oc 基础 - weak & autoreleasepool

116 阅读1分钟

__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进行处理

尽量减少 离屏渲染

比较耗费资源的话会在当前屏幕缓冲区之外创建新的缓冲区进行渲染操作

监听