黑马程序员---OC学习笔记之集合对象的内存管理

来源:互联网 发布:c语言批量修改文件名 编辑:程序博客网 时间:2024/05/22 14:32

——Java培训、Android培训、iOS培训、.Net培训——–

1、集合对象的内存管理

1)当一个对象加入到集合中,那么对该对象的【引用计数会+1】
2)当集合被销毁时,集合会向集合中的元素发送release消息
3)当集合销毁时,其中的对象不一定被销毁。如果其中的元素的引用计数不为1,那么即使发送了release消息 ,该对象也不会被销毁的。

2、集合对象的内存管理举例

【需要把项目从ARC模式切换到MRC模式】

//定义一个Person类用于测试,不需要成员变量#pragma mark Person类声明部分@interface Person : NSObject@end#pragma mark Person类实现部分@implementation Person//重写dealloc方法- (void)dealloc{    NSLog(@"人挂了...");    [super dealloc];}@end

1)把一个Person对象加入到NSArray中

 @autoreleasepool {        //定义一个Person对象        Person *p = [Person new];        NSLog(@"p 计数器值:%ld",[p retainCount]);        NSArray *arr = [NSArray arrayWithObject:p];        NSLog(@"p 计数器值:%ld",[p retainCount]);        [p release];    }

【打印结果】
2015-10-09 08:23:05.487 集合对象的内存管理[596:303] p 计数器值:1
2015-10-09 08:23:05.489 集合对象的内存管理[596:303] p 计数器值:2
2015-10-09 08:23:05.489 集合对象的内存管理[596:303] 人挂了…
【分析结果】
1)对象p添加到NSArray后计数器+1,此时对象p的计数器值为2
2)对象p自己发送了一个release消息,此时计数器值为1,但是自动释放池销毁时,对象p没有加入到自动释放池,也被销毁了,说明数组arr在销毁时向【对象p发送了一次release消息】。

0 0