【问题标题】:NSArray Vs. NSMutableArray IssuesNSArray 对比NSMutableArray 问题
【发布时间】:2014-01-13 17:05:05
【问题描述】:

在我的应用程序中,我设置了一个 NSArray,并将文档目录中带有 HTML 扩展名的所有对象添加到其中。
然后我使用这个数组来填充UITableView 但是......我不断收到警告

'NSArray' 可能不会响应'removeObjectAtIndex:'

如果我将其更改为 NSMutableArray,则该警告会消失,但会在此处弹出一个新警告:

self.files = [[[manager contentsOfDirectoryAtPath:documentsDirectoryPath
                                            error:nil]
                          pathsMatchingExtensions:[NSArray arrayWithObjects:@"html", nil]] retain];

那个警告是:

不兼容的指针类型从 'NSArray *' 分配给 'NSMutableArray *'

该应用运行良好,因为尽管存在removeObjectAtIndex: 问题,但编辑表格视图永远不会产生任何问题。

【问题讨论】:

  • 将长语句分成单独的行,这样更容易发现错误。您会立即看到 [[manager contentsOfDirectoryAtPath:documentsDirectoryPath error:nil] 返回一个 NSArray 而不是 NSMutableArray。 OPr 在指出错误的那条线上出现错误。将操作组合在一条线上是没有回报的。

标签: ios nsmutablearray nsarray


【解决方案1】:

使用mutableCopy 而不是retain

self.files = [[[manager contentsOfDirectoryAtPath:documentsDirectoryPath error:nil]
               pathsMatchingExtensions:[NSArray arrayWithObjects:@"html", nil]]
               mutableCopy];

【讨论】:

  • @Zaph:这与 ARC 无关(除非您需要在没有 ARC 的情况下添加 autorelease),而是将 NSArray 变成 NSMutableArray
  • @Zaph:那你为什么首先提到 ARC?
【解决方案2】:

pathsMatchingExtensions 返回一个普通的 NSArray 对象。

当我需要一个可变数组却得到一个不可变数组时,我会经常使用[NSMutableArray arrayWithArray:anArray]

在您的情况下,您可以将代码行更改为:

self.files = [NSMutableArray arrayWithArray:[[manager contentsOfDirectoryAtPath:documentsDirectoryPath error:nil]
                                                        pathsMatchingExtensions:[NSArray arrayWithObjects:@"html", nil]]];

【讨论】:

  • [anArray mutableCopy] 打字少 ;-) 除非您不使用 ARC,但我仍然更喜欢 [[anArray mutableCopy] autorelease]... 我认为意图更明确,但这只是问题品味。
  • @DarkDust 你说得有道理 :) 我将把这个答案作为另一种选择。
  • 谢谢@Aaron。我将另一个答案标记为正确,仅仅是因为它是先发布的。它不会让我立即接受,所以这就是为什么在您发布此内容时没有接受任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
相关资源
最近更新 更多