内存泄漏是新手必然要经历的痛,NSMutableArray的正确使用(转载)

Python教程:一文了解Python的深拷贝与浅拷贝 理解 Python 中的深拷贝(deep copy)和浅拷贝(shallow copy)是非常重要的,特别是在处理嵌套结构的数据时。让我们深入探讨这两个概念,并通过代码示例进行说明。 阅读详情

内存泄漏是新手必然要经历的痛,NSMutableArray的正确使用(转载)


转载自http://www.devdiv.com/home.php?mod=space&uid=18486&do=blog&id=6527

iPhone开发学习笔记:内存泄漏是新手必然要经历的痛,NSMutableArray的正确使用

iPhone程序开发中的内存泄漏问题是新手非常头痛的事情,可能是用C#这类自动垃圾释放的语言太习惯了,用xcode中的profile工具查了一下我写的小程序,内存泄漏了一大堆,经过一阵子排查,在NSMutableArray中添加对象后不正确维护对象的引用计数是一个主要原因。

在NSMutableArray how to properly addObjects and release这个讨论主题中,给出了正确的使用NSMutableArray的步骤,先看他给出的代码。

NSMutableArray *listData = [[NSMutableArray alloc] init];

for (int i = 0; i < 3; i++) { 
    MyData *obj = [[MyData alloc] init];
    NSString *name = nil;  
    switch (i)     {
        case 0:   
           name = @"Semen";   
           break;    
       case 1:         
           name = @"Ivan"; 
           break;           
       case 2:        
           name = @"Stepan";  
           break;         
       default:       
           break;  
    }         
    obj.name = name;   
    [listData addObject: obj];  
   

[obj release];

 
 } 
 [listData release];   

里面提到了3个问题,翻译后加上我的理解:

(1)NSMutableArray这个数组里面包含的对象是什么?是对象的一份拷贝,还只是一个对象的指针?

答:数组里存放的不是对象的复本,只是对象的指针。

按以前所学的C++的思维方式,上面的这句[obj release]是最难理解的,我把obj放在数组里,数组里存放的是对象的引用,为什么把obj释放了?这样数组里存放了一个无效的指针?实际上还是思维方式没有转变过来,在Objective-C中,[obj release]只表示obj收到一个release消息,如果它的引用计数没有变成0,它就不会释放,而在C++中见到这个release就想到了释放。我们来看一个过程:

MyData *obj = [[MyData alloc] init];   //obj用了init方法,按照约定,obj的引用计数是1,并且要自已来维护释放过程

[listData addObject: obj];    //obj在放到数组里的时候会自动给obj的引用计数加1,这时obj的引用计数就是2

[obj release];  //为了维持obj的正常计数值,用这条语句让obj的引用计数为1,仅此而已,并没有被释放掉!

[listData release]; // 这句会给obj再发一个release消息,这样obj的引用计数变为0,销毁。如果前面那条语句[obj release]不写,则obj的对象没有正常释放掉,就会造成内存泄漏!

(2)需要先释放掉数组里的所有对象,然后再释放NSMutableArray对象吗?

答:不需要。

在释放NSMutableArray对象里,它自动先给里面的对象发一个release消息。

(3)正确使用NSMutableArray的步骤是什么? (alloc, init, work, release)

答:

1. NSMutableArray *arr = [[NSMutableArray alloc] init];   //分配数组

2. alloc object1.              //分配obj1

3. add object1 to array.    //把obj1加到数组中

4. release object1.           //obj1引用计数减1

5. alloc object2.               //分配obj2

6. add object2 to array.    //把obj2加到数组中

7. release object2.            //obj2引用计数减1

8. add as many objects as needed in this manner.  // 按上面的办法,可以加任意多的对象

8. work with object1.        //可以访问里面的对象

9. remove object1 from array. it will receive a release automatically.  //也可以把obj1移除,这时obj1会自动收到一个release消息

10. [arr release];   // object2 and others will receive a release.  最后释放数组,数组里的所有元素也会自动得到一个release消息

上述道理对于NSMutableDictionary类的setObject方法也适用。


芒果YOLO11改进44:主干Backbone篇之MobileViT::结合最新 ICLR2022 顶会|轻量通用的MobileViT结构(一)Transformer,轻量级、通用且移动友好的视觉转换 MobileViT::结合最新 ICLR2022 顶会|轻量通用的MobileViT结构(一)Transformer,轻量级、通用且移动友好的视觉转换 阅读详情

相关推荐

GEE入门之路(从【初学者】角度,大白话)——附海面风速插值代码

非常初级的GEE入门教程!大白话!有手就行!附海面风速插值代码,克里金插值,时间插值。

weixin_46812066的博客 4086

iPhone开发笔记[12/50]:内存泄漏是新手必然要经历的痛,NSMutableArray的正确使用...

iPhone程序开发中的内存泄漏问题是新手非常头痛的事情,可能是用C#这类自动垃圾释放的语言太习惯了,用xcode中的profile工具查了一下我写的小程序,内存泄漏了一大堆,经过一阵子排查,在NSMutableArray中添加对象后不正确维护对象的引用计数是一个主要原因。 在NSMutableArray how to properly addObjects and release这个讨论主题中...

weixin_34023982的博客 229

Zotero PDF Translate插件实战:DeepL API免费申请与高效翻译配置指南

本文提供Zotero PDF Translate插件配置DeepL API的完整实战指南。详细介绍了如何免费申请DeepL API密钥,解决国内访问问题,并在插件中完成精细配置,实现文献阅读时的无缝划词翻译,大幅提升科研人员和学生的英文文献阅读效率。

rum55的博客 455

NSArray的一些用法

+(id)arrayWithObjects:obj1,obj2,...nil 创建一个新的数组,obj1,obj2......是他的元素对象,以nil对象结尾 -(BOOL)containsObject:obj 确定数组中是否包含对象obj -(NSUInteger)count 返回数组元素个数 -(NSUInteger)indexOfObject:obj 第一个包含obj元素的索引号

iOS界@迷糊小书童 2158

Stata面板数据OLS回归分析实战指南

OLS回归作为计量经济学的核心分析方法,通过最小化残差平方和实现参数估计,广泛应用于经济学实证研究。其技术价值在于模型简洁、结果易于解释,特别适合处理面板数据中的复杂关系。在实际应用中,配合robust标准误能有效解决异方差问题,而固定效应模型则可控制个体特异性。本文以Stata软件为例,详细演示从数据导入、描述性统计到混合OLS和固定效应模型构建的全流程,重点解析面板数据特有的格式设定、模型选择标准以及结果呈现技巧,为经济学研究者提供可直接复用的分析框架。

weixin_29051811的博客 268

Ubuntu22.04+PX4+Gazebo:从零到一构建无人机仿真开发环境

本文详细介绍了在Ubuntu22.04系统下搭建PX4+Gazebo无人机仿真开发环境的完整流程。从基础环境配置、PX4固件安装到Gazebo仿真环境搭建,提供了实用命令和常见问题解决方案,帮助开发者快速构建高效的无人机开发环境。

weixin_29243279的博客 434

OC--NSMutableArray可变数组

NSMutableArray继承自NSArray,所以,在上一篇文章中提到的属性和方法,在这里是适用的,但是也有不同的地方,既然是可变的,可动态分配的,那么他的创建就和NSMutableString一样先要去申请内存。所以NSMutableArray的创建和初始化就应该和NSMutableString的形式相同了。而不能够适用NSArray的简化形式。 说NSMutableArray之前我们先来

m0_37681833的博客 1524

5分钟搞定!用L型匹配电路优化窄带天线性能(附Smith圆图实操)

本文针对窄带天线阻抗匹配难题,提供了一套5分钟快速解决方案。通过详解L型匹配电路的核心原理,并结合Smith圆图这一射频工程师的“瑞士军刀”,手把手指导如何选择拓扑、计算元件值并进行实际调试,旨在帮助硬件工程师高效优化天线性能,实现最大功率传输。

yyy34的博客 443

NSArray和NSMutableArray相互转换, 以及常用方法-备

有时候项目中NSArray和NSMutableArray需要相互转化,下面给出相关代码1.NSArray 1.1 转化:NSMutableArray 1 NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array]; // array为NSMutableArray类型 ...

weixin_33827965的博客 525

使用Qt Creator自带的Qt Designer构造UI界面流程总结

在本文中,我们将总结使用Qt Creator自带的Qt Designer构造UI界面的流程。在对话框中,您可以选择一个控件的信号,然后将其连接到另一个控件的槽。例如,您可以将按钮的点击信号连接到一个槽函数,以响应按钮的点击事件。右键单击窗口设计器中的空白区域,选择适当的布局管理器,如水平布局、垂直布局或网格布局。在Qt Designer中,您可以使用各种预定义的UI控件来设计应用程序的界面。现在,您可以在应用程序的源代码中使用生成的UI界面。在您的源文件中,包含相应的头文件,然后创建一个UI界面的实例。

cl6789的博客 1392

指纹对抗指南:如何绕过Cloudflare与Akamai的5s盾与浏览器指纹检测

现在的CDN反爬技术虽然越来越强,但是道高一尺魔高一丈,只要掌握了指纹伪造、流量伪装、行为模拟这些核心技术,就可以绕过绝大多数的防护措施。对抗过程中要注意效率和成本的平衡,小规模爬取用Playwright+stealth最方便,大规模爬取用curl_cffi+代理池性价比最高,遇到验证码用打码平台或者自动识别服务,不需要死磕破解。本文介绍的方案已经在实战中验证过,可以绕过95%以上的Cloudflare/Akamai防护,成功率非常高。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 295

1.NSArray/NSMutableArray用法总结

NSArray用法总结NSArray用法总结 初始化与赋值 截取和处理数组 文件读写 数组判断 数组遍历 NSMutableArray用法总结 截取和处理可变数组 可变数组遍历初始化与赋值 //初始化 NSArray *arr = [[NSArray alloc] init]; //初始化 NSArrya *arr = @[@1, @2, @3]; //空数组

Murphy_Shi 579

DBC中如何实现报文传输类型属性的配置

AUTOSAR中CAN报文的传输类型主要有三种,周期型,事件型和混合型。周期型:按固定时间间隔自动发送,无需额外的触发条件。事件型:当信号值变化或满足内部条件时立即发送。混合型:默认按周期发送,但事件触发时可提前发送。

sunchengl的博客 303

NSMutableArray常用用法

1.创建可变数组对象 NSMutableArray*array=[[NSMutableArray alloc]initWithObjects:@"北京",@"上海",@"天津",@"南京",@"广州",nil]; NSMutableArray*array_1=[NSMutableArray  arrayWithObjects:@"One",@"Two",@"Three",@"Four",@

我的专栏 1187

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

day4_2: 数组NSArray NSMutableArray、值对象NSNumber、NSValue

数组NSArray NSMutableArray、值对象NSNumber、NSValue

tiebanshao的博客 612

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Foundation框架--NSMutableArray的使用

NSMutableArray的使用

likegoto的博客 483

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

NSMutableArray的用法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33862514的博客 298

nsarray 释放_NSMutableArray 内存释放分析

在关闭ARC情况下对NSMutableArray存储内存分析。一:测试环境构建1:创建一个简单视窗工程 在AppDelegate.m- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{self.window=[[[UIWindow a...

weixin_30040925的博客 517

iPhone开发笔记[9/50]:NSMutableArray中的自动释放对象让我郁闷了一整天

在做一个TableView程序时,要在表格里显示一个文件夹内所有文件的清单,程序在一开始显示时正常,但是一滚动窗口时就崩溃,查找这个错误整整花了我一天的时间,原来出在NSMutableArray初始化时用的方法不正确,都是因为Objective-C的基础知识没学好。 在一个UITableViewController类中声明了一个NSMutableArray *localFiles这样一个数组,作...

weixin_33928137的博客 191

NSMutableArray的基本使用

// //  main.m //  NSMutableArray的基本使用 // //  Created by apple on 15/9/18. //  Copyright (c) 2015年 apple. All rights reserved. // #import int main(int argc, const ch

顶天立地男子汉,无所不能真爷们 407

NSArray 和 NSMutableArray 定义和基本用法

/*          NSArray oc数组,不可变数组          */         //====================================================         //c数组,存的所有数据元素必须是相同的数据类型         //创建数组         NSArray *ary=[[NSArray alloc

小乔的博客 2301

NSArray和NSMutableArray常用方法总结

不可变数组对象: [array count] : 得到这个对象数组的长度。 [array objectAtIndex 0]: 传入数组脚标的id 得到数据对象。 [arrayWithObjects: ...] :向数组对象初始化赋值。这里可以写任意对象的指针,结尾必须使用nil。 NSArray 不可变数组 常用方法 +(id)arrayW

zhenweicao的专栏 2万+

为什么NSMutableArray必须用strong,而NSArray必须用copy?

1.NSMutableArray: @property (nonatomic, copy) NSMutableArray *mArray;//等同于 - (void)setMArray:(NSMutableArray *)mArray { _mArray = mArray.copy; } mArray属性就成了NSArray,NSMutableArray只能用strong修

ioswl的博客 5853

iOS内存管理(6)--NSArray与NSMutableArray用copy修饰还是strong

一、NSMutableArray 被copy、strong修饰后的变化: 把NSMutableArray用copy修饰有时就会crash,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变数组NSArray,没有响应的增删改方法,所以对其进行增删改操作就会报错。 举例如下: (1)copy: @property (nonatomic, copy  ) NS

Winzlee的专栏 2万+

NSMutableArray和NSArray的相互转换

记录一下 // NSArray --> NSMutableArray NSMutableArray *myMutableArray = [myArray mutableCopy]; // NSMutableArray --> NSArray NSArray *myArray = [myMutableArray copy];

精灵的专栏 4万+
上一篇: performSelector使用
下一篇: Using C++ With Objective-C
getengwork
博客等级 码龄15年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值