有关多线程和内存管理的学习

有关多线程和内存管理的学习

  1. 内存管理的思考方式 - 如下四点
    自己生成的对象,自己持有
    非自己生成的对象,自己也能持有
    不再需要自己持有的对象时释放
    非自己持有的对象无法释放
  2. 有关”生成”、”持有”、”释放”以及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方法

你可能感兴趣的:(iOS学习,oc内存学习)