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]];
如何在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 的指针。