OC-049.集合中的内存管理(MRC和ARC)

1.MRC中,集合的内存管理

·当你添加一个对象到集合,集合就会对这个对象进行一次retain的操作
·当你从集合中删除一个对象的时候,集合就会对这个对象进行一次release的操作
·当集合销毁的时候,会对集合中所有的元素进行一次release操作

#import //------main.m
#import "LSMe.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        LSMe *me = [[LSMe alloc] init];
        NSLog(@"%zd",me.retainCount);//1
//    NSMutableArray *array = [NSMutableArray array];如果是类方法,在出自动释放池才释放LSMe
        NSMutableArray *array = [[NSMutableArray alloc] init];
        [array addObject:me];//添加一个元素,集合会对这个对象retain一次
        NSLog(@"%zd",me.retainCount);//2
//        [array removeObject:me];//删除一个元素,集合会对这个对象release一次
        [array release];//集合销毁时,里面所有的对象都会被release一次
        NSLog(@"%zd",me.retainCount);//1
        [me release]; //LSMe释放了    
    }
    return 0;
}
#import //------LSMe.h

@interface LSMe : NSObject

@end
#import "LSMe.h"//------LSMe.m

@implementation LSMe
-(void)dealloc{
    NSLog(@"%s",__func__);
    [super dealloc];
}
@end



2.ARC中,集合的内存管理

·当你把一个对象添加集合中。集合就会对这个对象有一个强引用(指针)
·当你从集合中删除一个对象的时候,集合就会释放掉对这个对象强引用(指针)
·当数组销毁的时候,它会释放调用其所有元素的强引用

#import //------main.m    LSMe.h和.m省略了,.m请重写dealloc
#import "LSMe.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
         LSMe *me = [[LSMe alloc] init];
         NSMutableArray *array = [[NSMutableArray alloc] init];
//       me = nil; 在这边清空指针 me会释放,没有强指针指向me了
        [array addObject:me];//添加一个对象,集合会对这个对象有一个强指针指向
//        [array removeObject:me];//删除一个对象,会释放这个强指针
         me = nil;
        array = nil;//释放数组的时候,它里面所有的强指针都将释放
      
    }
    return 0;
}


你可能感兴趣的:(OC-049.集合中的内存管理(MRC和ARC))