NSMutableArray

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 的指针。

原文地址:https://www.cnblogs.com/ygm900/p/2867483.html