内存管理与block
2019-01-11 本文已影响6人
健健锅
/*
1. 自己生成,自己持有, alloc , new ,copy, mutableCopy
2.非自己生成的也能持有 [NSMutableArray array] 不持有对象 通过retain 可持有
retain count :采用散列表(引用计数表)来管理引用计数器,这样可以查询引用的对象地址
autorelease : runloop 生成NSAutoreleasePool ,加入pool runloop 结束 pool 销毁
在pool未销毁的过程中,大量产生autorelese对象,只要pool不释放,如大量读取图片
采用@autoreleasepool{} 及时释放
autorelease 的实现: NSAutoreleasePool 是一个连接列表 同NSMutableArray 相同
AutoreleasePoolPage push pop
二, 所有权修饰符
对象类型,就是指NSobject 的类的指针 id 类型 是对象类型 隐藏类名称部分
__strong 默认的 在变量作用于以及赋值
__weak 不持有对象 使用weak 是 查询对象是否存在 不持有时直接值nil 不产生野指针
__unsafe_unretained 同样修饰对象,不持有对象但是不自动置nil 效率高点相对于weak
__autoreleasing :方法的参数 传递 NSError的对象指针,而不是返回值,这样 对象的指针直接被autorelease 修饰,直接加入autoreleasePool 方法中不需要管理参数error的引用计数,这里会生成一个__autoreleasing的临时变量,所以出现了实参传递过程中不是同一个对象。
一般方法传递参数对象 为值传递,二nserror 为对象指针传递,这样可根据对象指针的指针去拿到对象的指针去修改对象
https://blog.csdn.net/wnnvv/article/details/81144219
https://www.jianshu.com/p/6f284bd7cf0a
main 函数中的 @autoreleasepool 将主线程的对象加入到 runloop中,主线程销毁 那么销毁相应的UIApplicationMain
三,
1. init 方法初始化alloc方法返回的对象,然后原封不懂得返给调用方
https://www.jianshu.com/p/92e095225cea
2, id 和 void* 的转换 (__brige的原理)
3.数组
四,ARC 的实现
ARC 是有编译器llvm 和runtime 共同完成
__weak 修饰符变量所引用的对象会被注册到autoreleasepool 中,那么pool 结束之前可以正常适应,但是每次是使用__weak ,该对象都会注册到 pool,的对象也会大量增加,使用之前最好strong一下
1.__weak 修饰符所引用的对象被废弃是,z将自动置空,
2.使用weak的对象时,注册到autoreleasepool 中
*/
/*
block : 带有自动变量值的匿名函数
^ 返回值类型(参数){表达式} ^int(int k){ return k + 1}
block 捕获外部变量的值,不能被修改 如果为NSMutableArray 可以对数组操作,但是不等对数组array 赋值
因为截获的是这个对象结构体
不能捕获C语言数组 const char text[] = "sdsd" 修改成 const char *text[] = "sdsd"
*/