iOS 中由数组 NSArray 与 NSMutableArray 的使用理解偏差引发的多宗血案

iOS 中由数组 NSArray 与 NSMutableArray 的使用理解偏差引发的多宗血案

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生
-  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

这个简单问题,一直以来,五年苹果开发经验告诉我,不值得一提,也没有什么可提的。

不过,今天我犯了一个不值得一提的错误,一直以来,自认为不值得一提的错误,也是不断忽视之后,由认识变得陌生而导致的小错误。

题目是:遍历一个数组,符合条件的,加入另一个数组,同时从这个数组中移除掉,以节约存储空间。

分析:

1、由于是同一个对象在数组之间的加减,这个只是在加、减指针而已,只是增加引用计数,并没有增加实际内存空间分配;

2、加到没啥问题,我声明的目标数组是 NSMutableArray ,减的时侯,我使用的是 delete 方法,不过这个方法确实存在;

声明

NSArray *rows = [fileContent componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
NSMutableArray *geometryRows = [[NSMutableArray alloc] init];

使用

[geometryRows addObject:row];
[rows delete:row];

这里借 UIResponder 犯了这样的一个错误,自动提示出了这个类的 delete 方法;

而实际上 rows 是 NSArray 其元素是不可编辑的,改成如下即可:

    NSMutableArray *rows = [NSMutableArray arrayWithArray:[fileContent componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]];

不过,当前这个题目,就是个没事儿找事儿的题目,为什么这么说呢?原因如下:

1、再增加,也是增加原对象的引用计数和指针地址,并不会有新的原对象内容复本内存发生分配,所以附增的内存分配很小,不用考虑;

2、离开当前环境,声明的指针不存在了,原指针所指向的内容,不再有指针索引,则 ARC 在编译时会检测到,为其添加释放内存的代码,故无需考虑内存泄漏;

3、由此可见,过分担心,没事儿找事儿,引发了这么多血案,浪费了这么多吐沫,希望还能有一点作用,就是用来警醒世人,不要再犯由此引发的一系列理解上偏差而造成的多宗血案;

钦此!

时间: 2024-12-31 17:22:44

iOS 中由数组 NSArray 与 NSMutableArray 的使用理解偏差引发的多宗血案的相关文章

ios-IOS中如何数组内容比较得到最大值

问题描述 IOS中如何数组内容比较得到最大值 有数组charAry,数组内容为:9, 87bh, j65, 159, 27, 3582, 64957, hg75b, 20140402b,请问怎么比较得到整数最大值64957 解决方案 NSNumber * max = [charAry valueForKeyPath:@"@max.self"];

iOS中NSArray数组常用处理方式_IOS

1. 数组的常用处理方式 //--------------------不可变数组 //1.数组的创建 NSString *s1 = @"zhangsan"; NSString *s2 = @"lisi"; NSString *s3 = @"wangwu"; //(1) NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil]; NSLog(@"%@",a

ios中怎么定义数组常量?

问题描述 ios中怎么定义数组常量? static const NSArray *imgArr = @[@"引导页1",@"引导页2",@"引导页3"]; 我这样写,报错:initializer element is not a compile-time constant 请问要怎么写? 解决方案 IOS:定义常量iOS 常量和全局变量的定义关于iOS一些常量定义的技巧 解决方案二: 全局变量必须被初始化为一个恒定的值, 如果你想有一个全局变量,

objective c-添加NSMutableArray到另一个NSMutableArray中时数组值

问题描述 添加NSMutableArray到另一个NSMutableArray中时数组值 NSMutableArray *no1=[[NSMutableArray alloc]init]; NSMutableArray *no2=[[NSMutableArray alloc]init]; for(int i=0;i<3;i++) { for (int j=0;j<=i;j++) { NSString *no_str=[NSString stringWithFormat:@""

IOS中KVC与KVO的应用解析

IOS中KVC与KVO的应用解析 一.NSKeyValueCoding(KVC) 1.从一个小例子引入 KVC键值编码是Object-C为我们提供的一种对成员变量赋值的方法.在探讨其方法之前,我们先来看一个小例子: 首先,创建一个数据模型model类: ? 1 2 3 4 5 6 7 8 //.h文件 #import <Foundation/Foundation.h> @interface Model : NSObject {     @public//将成员变量设置为公有的 以便其他文件有访

实例讲解iOS中的UIPageViewController翻页视图控制器_IOS

一.引言 UIPageViewController是iOS中少见的动画视图控制器之一,通过它既可以创建类似UIScrollView与UIPageControl结合的滚屏视图,也可以创建类似图书效果的炫酷翻页视图. UIPageViewController在iOS 5 SDK中首次引入,它使得开发者可以使用这个ViewController创建分页视图.在iOS 6中,这个类有了更新,支持滚动过渡效果.使用Page View,用户可以方便的通过手势在多个页面之间导航.UIPageViewContro

浅析iOS中的浅拷贝和深拷贝(copy和mutableCopy)_IOS

ios提供了copy和mutablecopy方法,顾名思义,copy就是复制了一个imutable的对象,而mutablecopy就是复制了一个mutable的对象. copy与retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数加1.Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化.copy减少对象对上下文的依赖. retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的

iOS 中的 21 种设计模式

iOS 中的 21 种设计模式 对象创建原型(Prototype) 使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象. 1 2 NSArray *array = [[NSArray alloc] initWithObjects:@1, nil]; NSArray *array2 = array.copy; array 就是原型了,array2 以 array 为原型,通过 copy 操作创建了 array2. 当创建的实例非常复杂且耗时,或者新实例和已存在的实例值相同,使用原型模式

iOS中几种数据持久化方案:我要永远地记住你!

概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 沙盒 在介绍各种存储方法之前,有必要说明以下沙盒机制.iOS程序默认情况下只能访问程序自己的目录,这个目录被称为"沙盒". 1.结构 既然沙盒就是一个文件夹,那就看看里面有什么吧