博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSMutableArray
阅读量:6969 次
发布时间:2019-06-27

本文共 2894 字,大约阅读时间需要 9 分钟。

1、数组没有进行alloc之前,内存地址是0,即还没有分配内存。此时在系统中的状态是nil(即不存在)。一旦alloc之后,系统就会为数组对象分配内存,状态就不再是nil。而是有具体的内存地址。

注意:nil是指在内存中没有分配响应的地址,即内存中压根没有它的位置。如果一旦alloc,那么这个对象的状态就不会是 nil 了。

(1)未alloc前

(2)alloc后

 

 

 /*--------------在数组末尾添加对象----------------*/

 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"One",@"Two",@"Three",nil];      
 [array addObject:@"Four"];

 

 /*--------------快速枚举----------------*/

1)数据中的元素是字符串

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"One",@"Two",@"Three",nil];
for(NSString *string in array)
{
     NSLog(@"string:%@",string);
}

2)数组中的数据是NSMutableDictionary

for(NSMutableDictionary *tmpRow in tableEatPlat)

{

       ……

}

----★使用NSMutableArray要防止内存泄露★------

NSObject* p1 = [[NSObject alloc] init];
NSObject* p2 = [[NSObject alloc] init];
NSMutableArray* objectsArray = [[NSMutableArray alloc] init];

[objectsArray addObject:p1];

NSLog(@"p1 count:%d", [p1 retainCount]);//输出 2,也就是执行追加对象后,对象的计数器也被加1
//[p1 release];            
//NSLog(@"p1 count:%d", [p1 retainCount]);

//同样做数组替换时

[objectsArray replaceObjectAtIndex:0 withObject:p2];
NSLog(@"p2 count:%d", [p2 retainCount]);//输出 2,同样也是2
NSLog(@"p1 count:%d", [p1 retainCount]);//输出 1,对象p1仍然存在
//[p2 release];
//NSLog(@"p2 count:%d", [p2 retainCount]);

//执行清空数组

[objectsArray removeAllObjects];
NSLog(@"p2 count:%d", [p2 retainCount]);//输出 1,对象p2仍然存在
//[p2 release];

由此可知,每次执行上面的数组操作后,要执行对象release,如上面注释中的语句,才能保证内存不泄露。

 

注:我们不能把nil加到array中。但有时候我们真想给array加一个空的对象,可以使用NSNull来做这件事。如:

[myArray addObject:[NSNull null]];

 

无法在 NSArray 中添加元素,因为它是不可编辑的,而可变数组 NSMutableArray 可以,但是如果想构造一个只包含空元素的数组就有点问题了,因为“不能添加nil到array中”,下面的语句在运行时会导致程序崩溃:NSMutableArray *array = [[NSMutableArray alloc] init];[array addObject:nil];[array release];也不能使用 initWithCapacity 来构造包含空元素的数组,因为它只是告诉Objective C该数组可能的大小,作为优化内存分配的建议,实际上调用之后数组的元素数量为0。不能添加nil到array中,但有时需要将一些表示“空”的对象添加到array中。NSNull类正是基于这样的目的产生的。下面就是NSNull类的实例,用NSNull表示一个占位符时,语句表达如下:[array addObject:[NSNull null]];接下来的问题就是,怎么判断数组中某个元素为空了if obj is nil , [obj message] will return NO, without NSExceptionif obj is NSNull , [obj message] will throw a NSExceptiontesting NSNull: (NSNull *)obj == [NSNull null]下面是关于数组中空值的判断测试程序id aValue = [arrayWithNull objectAtIndex:0];if (aValue == nil) {    NSLog(@"equals nil");} else if (aValue == [NSNull null]) {    NSLog(@"equals NSNull instance");    if ([aValue isEqual:nil]) {        NSLog(@"isEqual:nil");    }}// output: "equals NSNull instance"下面是一个实际的代码:    // store cells    NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:[self.metas count]];    for (int i = 0; i < [self.metas count]; ++i) {        [array addObject:[NSNull null]];    }    self.cells = array;    [array release];// 判断的代码,注意需要进行类型转换,否则Xcode就会警告。        UITableViewCell *cell = [self.cells objectAtIndex:row];        //if (cell == nil) {    //if (cell == [NSNull null]) {
if ((NSNull *)cell == [NSNull null]) {从上面的代码可以看出,Objective C中的类型系统确实有些怪异,明明是一个 UITableViewCell 的指针,确可以存储 NSNull 的指针。

 

 

转载地址:http://lcfsl.baihongyu.com/

你可能感兴趣的文章
bzoj 2244: [SDOI2011]拦截导弹
查看>>
UNIX 系统概述
查看>>
Ubuntu14.04下安装Hadoop2.4.0 (单机模式)
查看>>
每周一荐:Google的序列化框架Protobuf
查看>>
002-B/S架构&C/S架构
查看>>
iOS注册collcetionViewFlowLayout
查看>>
python-selenium 元素定位
查看>>
windows下python的安装
查看>>
解决数据库卡、慢,问题多,难管理——老技术的执著
查看>>
四则运算的进度和遇到的问题
查看>>
java继承如何理解呢??
查看>>
只读字段(readonly)和常量(const)
查看>>
nyoj 1129 Salvation
查看>>
c#文件操作(创建、添加)
查看>>
CEntOS 安装增强功能
查看>>
MySQL之Join
查看>>
git详细说明
查看>>
Hdoj 1253
查看>>
ios学习视频比较
查看>>
mysqlbinlog读取二进制日志文件时,报错 (转)
查看>>