【问题标题】:Adding objects to an NSmutableArray from a C Array从 C 数组向 NSmutableArray 添加对象
【发布时间】:2014-09-12 02:31:41
【问题描述】:

我有一个 NSmutable 数组,我正在向它添加 C 数组中存在的一些字符串。通过使用这种方法

if (!self.arrayOfVariableNames) {
        self.arrayOfVariableNames = [[NSMutableArray alloc] init];
        for (int i = 0; i< cols; i++) {
            [self.arrayOfVariableNames addObject:[NSString stringWithCString:cArrayOfVariableNames[i] encoding:NSUTF8StringEncoding ]];
        }
    }
    else{
        [self.arrayOfVariableNames removeAllObjects];
        for (int i = 0; i< cols; i++) {
        [self.arrayOfVariableNames addObject:[NSString stringWithCString:cArrayOfVariableNames[i] encoding:NSUTF8StringEncoding ]];
        }
    }   

这个方法是否保证了当C数组被取出内存时,NSmutableArray中的对象不会被释放?

【问题讨论】:

  • YES ..你有什么问题吗?
  • 其实问题很多。我是一名自学成才的程序员,我几乎要放弃,因为我无法弄清楚某些事情。我必须在表视图中使用这个数组,但是在实现表视图数据源方法时,这个数组变为空。
  • 如果你的 NSArray 变为零,你就没有对它保持强烈的引用。使其成为控制器的属性。
  • 所有数组都有强引用。在单独的 ViewController 中有一个 NSTableView,它使用这个 tableview 来获取数据,当我记录内容时,我收到一个错误
  • 如何将数组传递给第二个视图控制器?

标签: objective-c macos cocoa nsarray


【解决方案1】:

如果这个数组arrayOfVariableNames 变为 Null,那么问题出在数组的初始化上。请尝试通过这样做来使用延迟加载:

- (NSArray*)arrayOfVariableNames {
    if (!_arrayOfVariableNames) {
        _arrayOfVariableNames = [[NSMutableArray alloc] init];  //initialise the array if needed
    }
    return _arrayOfVariableNames;  //else return the already initialized array
}

请在您的代码中注释掉这一行:self.arrayOfVariableNames = [[NSMutableArray alloc] init];

****编辑****
请在https://docs.google.com/file/d/0BybTW7Dwp2_vdHhQN1p1UzExdTA/edit?pli=1 中找到更新代码。看看吧。

【讨论】:

【解决方案2】:

是的。 NSArray 保留了其中的任何内容。 但是你应该停止链接你的 NSString 创建,而是在将它添加到数组之前创建一个字符串。然后检查零。 仅当它不为零时才将其添加到数组中。 防御性地编写代码。

【讨论】:

  • NSStrings 从 C-strings 复制数据,因此当 C-strings 被释放时它们不会被修改,并且 NSArray 将保留 NSStrings 的副本,因此不会释放 NSStrings。 .
  • 关键是你不能保证你会从 C 字符串中得到一个 NSString。它可能因多种原因而失败。您不能将 nil 添加到 NSArray 或 NSMutableArray。
  • 我在文档中没有看到string returning with nil,但你提出了一个非常好的观点。我试图澄清 C-strings 被复制到 NSStrings 中,因此在 C-strings 被释放后仍然存在。
【解决方案3】:

arrayOfVariableNames 在 C 数组被释放时不会改变。

确保您的 arrayOfVariableNames 变量为 strong

@property (nonatomic, strong) NSMutableArray *arrayOfVariableNames;

    if (!self.arrayOfVariableNames) 
    {
      self.arrayOfVariableNames = [[NSMutableArray alloc] init];
    }
    else
    {
      [self.arrayOfVariableNames removeAllObjects];
    }

   for (int i = 0; i< cols; i++) 
   {
       NSString *tempString = [NSString stringWithCString:cArrayOfVariableNames[i] encoding:NSUTF8StringEncoding];

       if([tempString length] > 0)
       {
         [self.arrayOfVariableNames addObject:tempString];
       }
       else
       {
         NSLog(@"string is empty");
       }
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多