NSTimer、注册runloop等循环问题,NSTimer持有self,runloop和thread一一对应,主线程不退出,self无法回收,造成循环引用。 加工:1。通过包含块的定时器函数方法创建定时器,并配合弱、强操作。 2.通过中介创建一个实例对象(例如,创建一个继承NSProxy的实例对象)。在这个文件中,announcement属性(由weak修改)通过作为目标执行器的Selector: (SEL) SEL {}和-(void)Forward Invocation:(NSInvocation *)调用的-(NSMethodSignature *)MethodSignature传递。 然后这个实例对象被strong外部修饰。当定时器正常释放销毁时,调用析构函数,清除弱引用表,不会造成额外的持有。 3.创建一个NSobject类型的对象,调用addMethod方法动态添加方法,改变原来要执行的操作方法。 注意:弱的操作要慎用。 在处理循环引用时使用。 执行weak时,底层调用objc_initWeak函数,然后store_weak会涉及到weak_register,通过hash操作放入weak_table,key:当前对象的地址,value:weak对象的所有地址。 当一个对象被释放时,它将调用weak_unregister,遍历弱引用表,并通过弱指针将所有对象设置为nil。 相对消费表现 界面优化可以异步操作,将UI分解成小任务。 界面慢的原因及相应的解决方法:1。耗时的操作:文字计算、绘制大量图片、高清画图——分线程操作;2.CGD在短时间内创建大量任务——使用线程池处理(提前创建若干可执行线程,放入一个池中。必要时不需要从线程池中创建线程,使用后也不需要销毁线程,可以直接放回池中,减少了创建和销毁线程对象的开销)。滑动优化可以从CPU和GPU层面考虑:CPU:创建和销毁对象;预布局(布局计算-);预渲染(文本等异步渲染,图片编解码等。)子线程操作,减少CPU时间消耗GPU:纹理渲染,避免离屏渲染(GPU在当前屏幕缓冲区之外开发一个新的缓冲区用于渲染操作。 GPU增加的工作量导致CPU+GPU工作量之和超时,导致卡慢。 );通过CPU异步绘图减轻GPU压力;降低视图级别的复杂性。 除了使用工具,还可以通过代码来检测内存泄漏。在视图生命周期结束时,可以推迟发送消息,并通过响应返回值来判断是否可以释放所有内容。 NSLog(@ "方法响应的返回值表明可能导致了内存泄漏% @ "、nsstringfromclass([self class]);