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

  • 相关阅读:
    使用Xcode和Instruments调试解决iOS内存泄露(转载) sansan
    GCD介绍(二): 多核心的性能(转载) sansan
    iphone 常用的<app>info.plist设置(转载) sansan
    GCD介绍(一): 基本概念和Dispatch Queue (转载) sansan
    iOS 证书与签名 解惑详解[转] sansan
    Xcode快捷键 sansan
    GCD介绍(三): Dispatch Sources(转载) sansan
    Apple开发者授权 sansan
    MFC中Spin control的使用
    c++ windows mobile中设置菜单活动与否
  • 原文地址:https://www.cnblogs.com/ygm900/p/2867483.html
Copyright © 2020-2023  润新知