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

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

(1)未alloc前

NSMutableArray_类型转换

(2)alloc后

NSMutableArray_内存地址_02


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

 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]];


如何在NSMutableArray中添加空元素


无法在 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 NSException if obj is NSNull , [obj message] will throw a NSException testing 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 的指针。