有关多线程和内存管理的学习
- 内存管理的思考方式 - 如下四点
自己生成的对象,自己持有
非自己生成的对象,自己也能持有
不再需要自己持有的对象时释放
非自己持有的对象无法释放 - 有关”生成”、”持有”、”释放”以及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方法
本文详细解析了Objective-C中的内存管理机制,包括对象的生成、持有、释放及废弃操作,以及所有权修饰符在内存管理中的应用。通过具体代码示例,阐述了不同Objective-C方法如何影响对象的引用计数,并解释了autorelease与release的区别。
2万+

被折叠的 条评论
为什么被折叠?



