【问题标题】:NSMutableArray and memory managmentNSMutableArray 和内存管理
【发布时间】:2011-07-01 20:20:30
【问题描述】:

我正在学习来自具有垃圾收集功能的语言的 Objective C,并且我正在努力处理内存管理。特别是我正在努力解决在这种情况下发生的事情。

// Global variable
NSMutableArray *parentArray;

// Instance
- (void)testing {
  parentArray = [[NSMutableArray alloc] init]; 
  NSMutableArray *childArray = [[NSMutableArray alloc] init];

  [childArray addObject:@"mike"];
  [parentArray addObject:childArray];
}

childArray 是一个指向数组的指针,所以当我将它添加到 parentArray 时,它是复制它还是传递指针?如果像我想的那样,它传递了我无法在此方法中 [childArray release] 的指针,因为它会破坏对象,我将无法在其他地方读取它。

所以我必须在类结束的主要dealloc方法中释放它吗?

任何帮助都非常感谢,因为我正在努力。

迈克

【问题讨论】:

    标签: iphone ios memory-management release-management retain


    【解决方案1】:

    你可以在同一个函数中释放 childArray,因为 NSMutableArray 保留了所有添加的对象。

    【讨论】:

      【解决方案2】:

      NSMutableArray(和所有其他标准的objective-c容器)保留添加到它们的对象,因此您可以在将childArray添加到parentArray后立即释放它。

      此外,立即发布将提高您的代码可读性 - 因为很明显,对象所有权传递给 parentArray。

      【讨论】:

        【解决方案3】:

        当您将 childArray 添加到 parentArray 时,它会保留一次。因此,在这一点上,您将在保留计数中有 2 个类似的值。因此,您可以轻松地在方法中释放 childArray(测试)并在 parentArray 中保留引用(保留计数 = 1)。那样就不会被销毁了。

        【讨论】:

          【解决方案4】:

          只需在 childArray 声明中添加“autorelease”,以便在可能的情况下释放该数组(当您释放拥有该孩子的 parentArray 时,childArray 将被释放)。

          // Global variable
          NSMutableArray *parentArray;
          
          // Instance
          - (void)testing {
            parentArray = [[NSMutableArray alloc] init]; 
            NSMutableArray *childArray = [[[NSMutableArray alloc] init] autorelease];
          
            [childArray addObject:@"mike"];
            [parentArray addObject:childArray];
          }
          
          - (void) dealloc {
             [parentArray release];
          }
          

          【讨论】:

            【解决方案5】:

            addObject:只添加对象指针,并保留添加的对象。 当removeObject: 数组移除item(pointer)时,item会收到release消息。

            • 当您NSMutableArray *childArray = [[NSMutableArray alloc] init]; 时,childArray 的 retainCount 为 1。
            • 当您[parentArray addObject:childArray]; 时,childArray 的 retainCount 为 2。

            当retainCount为0,内存不够时,对象会被销毁。

            有相同的代码:

            NSMutableArray *parentArray;
            
            parentArray = [[NSMutableArray alloc] init]; 
            NSMutableArray *childArray = [[NSMutableArray alloc] init];
            NSLog(@"1.childArray retainCount:%d",[childArray retainCount]);
            [childArray addObject:@"mike"];
            NSLog(@"2.childArray retainCount:%d",[childArray retainCount]);
            [parentArray addObject:childArray];
            NSLog(@"3.childArray retainCount:%d",[childArray retainCount]);
            [parentArray removeAllObjects];
            NSLog(@"4.childArray retainCount:%d",[childArray retainCount]);
            

            结果:

            1.childArray retainCount:1
            2.childArray retainCount:1
            3.childArray retainCount:2
            4.childArray retainCount:1
            

            试试就知道了。

            【讨论】:

            • 这是我的目标,因此是我的问题。
            • 只检查它的retainCount。我从未在程序中使用它。
            猜你喜欢
            • 2011-09-06
            • 2010-10-02
            • 1970-01-01
            • 1970-01-01
            • 2011-10-13
            • 1970-01-01
            • 1970-01-01
            • 2011-12-21
            • 1970-01-01
            相关资源
            最近更新 更多