有关多线程和内存管理的学习
- 内存管理的思考方式 - 如下四点
自己生成的对象,自己持有
非自己生成的对象,自己也能持有
不再需要自己持有的对象时释放
非自己持有的对象无法释放 - 有关”生成”、”持有”、”释放”以及OC中”废弃”的对象操作与OC中方法的对应, 如下:
对象操作 | Objective-C方法 |
---|---|
生成并持有对象 | alloc/new/copy/mutableCopy等方法 |
持有对象 | retain方法 |
释放对象 | release方法 |
废弃对象 | dealloc方法 |
注:(MRC下未用__strong修饰)仅生成对象,对象的引用计数不变,需持有对象时,对象的引用计数加1,所以alloc/new/copy/mutableCopy方法都会使引用计数加1,而通过便利构造器方法初始化对象,不会使引用计数发生变化,需要调用[object retain]方法使其持有对象,才会改变引用计数.
3. release与autorelease
[object release]; 立即释放对象
[object autorelease]; 不立即释放对象,先注册到autoreleasepool中,pool结束之后自动调用[object release]方法释放对象.
4. 所有权修饰符(__strong,__weak,__unsafe_unretained,__autoreleasing)**
__strong
__strong修饰符是id类型和对象类型默认的所有权修饰符(ARC下).
id obj = [[NSObject alloc] init]; //等同于如下代码:
id __strong obj = [[NSObject alloc] init];
__strong修饰符表示对对象的”强引用”.持有强引用的变量在超出其作用域时被废弃,随着强引用的时效,引用的对象也会随之释放.例:
{
/*自己生成并持有对象*/
id __strong obj = [[NSObject alloc] init];
/*因为变量obj为强引用,所以变量在超出其作用域时,对象会释放*/
}
/*超出作用域,释放对象*/
__weak
两个对象互相强引用,或者一个对象对自身强引用都会发生循环引用,为了解决这个问题,引入__weak修饰符。__weak和__strong修饰符相反,提供弱引用,弱引用不持有对象实例,.
__weak修饰符还有一优点:在持有某对象的弱引用时,若该对象被废弃,则此弱引用将自动失效且处于nil.防止野指针出现.
__unsafe_unretained
__unsafe_unretained和__weak类似,生成对象,不持有对象实例
__autoreleasing
ARC有效时,用__autoreleasing修饰符的变量替代autorelease方法