- 如果一个对象在初始化的时候什么都不写,默认的修饰符是strong,这意味着该对象的应用计数会+1,直到出了这个对象的作用域之后,该对象的引用计数会-1,从而导致该对象被释放。
- 如果一个强引用的对象被Block捕获后,该对象的引用计数就会增加,当这个Block被释放后对象的引用系数才会回到原来的大小
- 但是该对象被Block捕获后,其引用系数不是简单的+1,而是+2,原因是Block创建的时候在栈上,而在赋值给全局变量的时候,会拷贝到堆上
- 由于Block对对象的强引用,导致如果这个Block一直不被释放,那么这个对象也不会被释放,解决问题的方案很简单,就是在Block捕获这个对象的时候,新创建一个使用__weak修饰的weak对象,在Block中引用这个weak对象,那么在这个对象被释放的时候,这个weak对象指针自然会被赋值为nil
- Block在初始化的时候就已经调用了初始化函数,保存了Block所捕获的引用对象
- 除了在Block外使用__weak对对象进行弱引用,我们偶尔还需要在Block对弱引用的对象进行一次强引用,以保证这个对象在Block执行的过程中不会被释放
- 正确的做法是,在Block开始执行的时候,检验弱引用的对象是否还存在,若存在,则对弱引用的对象进行一次强引用,这样就保证在Block执行的过程中,引用的对象不会被释放,从而导致弱引用的对象变为nil。而在Block执行完之后,会对强引用的对象进行release操作,不会导致对象无法释放的情况
- Block在外部所捕获的对象和使用__Strong所强引用的对象,区别就是一个在定义的时候就会影响对象的引用系数,一个在Block执行的时候才会导致引用系数+1,而在Block执行完毕的时候会对强引用的对象的引用系数-1
- 一般__Strong只有在多线程的时候才会使用,单线程一般使用__weak即可,但是在多线程的时候,如果不使用__Strong对引用对象进行强引用,可能会在代码开始的时候对象还存在,但是下一步的时候对象已经被释放。
内存管理- __Strong、__Weak、__autoreleasing
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- “兄弟们,12月的战斗正式打响了!团队目标有3个:base25万冲刺35万,人人出单,人人破新高!”辉哥在启动会上...