Objective-C之集合对象的内存管理

集合对象的内存管理

本小节知识点:

  1. 【掌握】集合对象的内存管理
  2. 【理解】集合对象内存管理总结

1.集合对象的内存管理

  • 当一个对象加入到集合中,那么该对象的引用计数会+1
  • 当集合被销毁的时候,集合会向集合中的元素发送release消息
 NSMutableArray *arr = [[NSMutableArray alloc] init];

 Person *p = [[Person alloc] init];
 NSLog(@"retainCount = %lu", [p retainCount]);
 [arr addObject:p];
 NSLog(@"retainCount = %lu", [p retainCount]);
 [p release];
 NSLog(@"retainCount = %lu", [p retainCount]);
 [arr release];
  • 当一个对象加入到集合中,那么该对象的引用计数会+1
  • 当把一个对象从集合中移除时,会向移除的元素发送release消息
 NSMutableArray *arr = [[NSMutableArray alloc] init];
 Person *p = [[Person alloc] init];
 NSLog(@"retainCount = %lu", [p retainCount]);
 [arr addObject:p];
 NSLog(@"retainCount = %lu", [p retainCount]);
 [arr removeObject:p];
 NSLog(@"retainCount = %lu", [p retainCount]);
 [p release];
 [arr release];

2.集合对象内存管理总结

  • 1.官方内存管理原则

    • 1> 当调用alloc、new、copy(mutableCopy)方法产生一个新对象的时候,就必须在最后调用一次release或者autorelease
    • 2> 当调用retain方法让对象的计数器+1,就必须在最后调用一次release或者autorelease
  • 2.集合的内存管理细节
    • 1> 当把一个对象添加到集合中时,这个对象会做了一次retain操作,计数器会+1
    • 2> 当一个集合被销毁时,会对集合里面的所有对象做一次release操作,计数器会-1
    • 3> 当一个对象从集合中移除时,这个对象会一次release操作,计数器会-1
  • 3.普遍规律
    • 1> 如果方法名是add\insert开头,那么被添加的对象,计数器会+1
    • 2> 如果方法名是remove\delete开头,那么被移除的对象,计数器-1
时间: 2024-08-31 01:44:43

Objective-C之集合对象的内存管理的相关文章

WINX窗口类对象的内存管理

为了引入WINX窗口类对象的内存管理(生命周期模型),我绕了一大圈子.实在是,内存 管理太重要了,花多少口舌介绍它都不过分.我曾经见到这样一句话:"C++程序员觉得 内存管理太重要了,所以一定要自己进行管理:Java/C#程序员觉得内存管理太重要了,所以 一定不能自己去管理".从某种意义上说,两者都是对的. 那么WINX的窗口对象是否也是采用gc allocator呢? 答:不是. 具体问题具体分析.在通常情况下,我个人确实已经非常习惯使用gc allocator来进行内 存管理,但是

高质量C++/C编程指南-第7章-内存管理(4)

7.5 free和delete把指针怎么啦?7.7 杜绝"野指针""野指针"不是NULL指针,是指向"垃圾"内存的指针.人们一般不会错用NULL指针,因为用if语句很容易判断.但是"野指针"是很危险的,if语句对它不起作用. "野指针"的成因主要有两种: (1)指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的同时应当被初始化,要么

Java实时应用程序中的内存管理

使用Java的一个主要优点就是无需担心废弃对象,即,让Java运行时负责Java对象的内存管理. 这是通过让Java运行时对不再使用的Java对象进行垃圾收集而实现的. 垃圾收集是一个比较复杂的过程.通常,Java运行时会遍历堆,检查不再被其他对象引用.从而可以安全删除的对象,然而,由于垃圾收集占用CPU周期,所以它可能会影响应用程序代码的执行.即,如果在执行应用程序代码的过程中执行垃圾收集,则应用程序代码的响应时间可能延长.这会导致用户事务延迟的延长.更为糟糕的是,因为用户不知道何时会进行垃圾

Linux编程C++内存管理的指针传递详解

指针参数是如何传递内存的? 如果函数的参数是一个指针,不要指望用该指针去申请动态内存.示例7-4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么? 1 2 3 4 5 6 7 8 9 10 void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMe

C++内存管理学习笔记(3)

/****************************************************************/ /*            学习是合作和分享式的! /* Author:Atlas                    Email:wdzxl198@163.com    /*  转载请注明本文出处: *   http://blog.csdn.net/wdzxl198/article/details/9078965 /**********************

OC内存管理-OC笔记

内存管理细节:http://blog.sina.com.cn/s/blog_814ecfa90102vus2.html 学习目标 1.[理解]内存管理 2.[掌握]第一个MRC程序 3.[掌握]内存管理的原则 4.[理解]野指针与僵尸对象 5.[理解]单个对象的内存管理 6.[理解]多个对象的内存管理 7.[掌握]set方法的内存管理 8.[掌握]@property参数 9.[掌握]@class关键字 10.[理解]循环retain 一.内存管理 程序在运行过程中会在堆空间创建大量的对象,当对象

C++的内存管理

这篇文章是我在学习高质量C++/C编程指南中的第7章"内存管理"后的一篇笔记,之前我也写过相关的文章指针以及内存分配,但我感觉那篇还不是很好,这篇我很把它更完善一些 一.内存的常见分配方式   1. 从静态区分配,一般是全局变量和static类型变量   2.从栈区分配内存,一般是局部的变量,会随着所在函数的结束而自动释放   3.从堆中分配,一般是使用手动分配,使用malloc()函数和new来申请任意大小空间,不过要手动释放空间,相应的使用free()函数和delete释放,   

IOS中内存管理那些事_IOS

Objective-C 和 Swift 语言的内存管理方式都是基于引用计数「Reference Counting」的,引用计数是一个简单而有效管理对象生命周期的方式.引用计数分为手动引用计数「ARC: AutomaticReference Counting」和自动引用计数「MRC: Manual Reference Counting」,现在都是用 ARC 了,但是我们还是很有必要了解 MRC. 1. 引用计数的原理是什么? 当我们创建一个新对象时,他的引用计数为1: 当有一个新的指针指向这个对象

理解iOS的内存管理

远古时代的故事 那些经历过手工管理内存(MRC)时代的人们,一定对 iOS 开发中的内存管理记忆犹新.那个时候大约是 2010 年,国内 iOS 开发刚刚兴起,tinyfool 大叔的大名已经如雷贯耳,而我还是一个默默无闻的刚毕业的小子.那个时候的 iOS 开发过程是这样的: 我们先写好一段 iOS 的代码,然后屏住呼吸,开始运行它,不出所料,它崩溃了.在 MRC 时代,即使是最牛逼的 iOS 开发者,也不能保证一次性就写出完美的内存管理代码.于是,我们开始一步一步调试,试着打印出每个怀疑对象的