【问题标题】:Xcode 7, Obj-C, "Null passed to a callee that requires a non-null argument"Xcode 7,Obj-C,“Null 传递给需要非空参数的被调用者”
【发布时间】:2015-09-14 06:58:27
【问题描述】:

在 Xcode 7 中,我收到以下警告:

Null passed to a callee that requires a non-null argument

.. 来自 NSMutableArray 的这个 nil 初始化...

    sectionTitles = [[NSMutableArray alloc] initWithObjects:nil];

我发现我应该改用removeAllObjects

    [sectionTitles removeAllObjects];

但是,这不允许我评估 sectionTitles.count == 0。我确实尝试了sectionTitles == nil,但是除非我使用iniWithObjects,否则我以后无法添加对象。

当我刷新数据源时,如果没有记录,我需要将数组设置为 nil 或零。除非我使用过initWithObjects,否则我似乎无法使用addObject 添加项目。

【问题讨论】:

  • 您只能使用已初始化的对象。不过,在 nil 上调用 count 会起作用。
  • if (sectionTitles.count != nil) 导致警告?
  • [sectionTitles removeAllObjects]sectionTitles = [NSMutableArray array] 应该可以工作,它们在逻辑上是相同的(尽管性能可能不同)。

标签: ios objective-c xcode cocoa-touch


【解决方案1】:

你为什么不试试:

sectionTitles = [[NSMutableArray alloc] init];

或以下任何一种:

sectionTitles = [[NSMutableArray alloc] initWithCapacity:sectionTitles.count];
sectionTitles = [NSMutableArray new];
sectionTitles = [NSMutableArray array];
sectionTitles = [NSMutableArray arrayWithCapacity:sectionTitles.count];

也许有些傻:

sectionTitles = [NSMutableArray arrayWithArray:@[]];
sectionTitles = [@[] mutableCopy];

有很多方法可以创建空的可变数组。只需阅读doc

【讨论】:

  • 我很惊讶人们(包括我自己)经常使用标准 init 以外的任何东西制作空数组 - 就像我想保持我的选择开放之类的。奇怪
【解决方案2】:

传递非空参数只是部分答案。

新的 Objective-C 可空性注解对 Swift 方面的代码有巨大的好处,但即使没有编写一行 Swift 代码,这里也有很大的好处。标记为 nonnull 的指针现在将在自动完成期间给出提示,如果发送 nil 而不是正确的指针,则会产生警告。

阅读 NSHipster comprehensive article

为了在您自己的代码中利用相同的合约,请使用nonnullnullable

Obj-C

- (nullable Photo *)photoForLocation:(nonnull Location *)location

【讨论】:

  • 太棒了,直到现在才知道这个东西!所以,可为空意味着值可以为 nil,非空意味着值不应该为空,对吧? +1
【解决方案3】:

用零初始化 NSMutableArray 时遇到同样的错误,

[[NSMutableArray alloc] initWithObjects:0, 0, 0, 0, 0, nil];

改成

[NSMutableArray arrayWithArray:@[@0, @0, @0, @0, @0]];

【讨论】:

  • A NSMutableArray 是一个对象数组。文字,如 0 或 1,不是对象。 @0NSNumber(一个对象)的简写,初始化为 0。
猜你喜欢
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
相关资源
最近更新 更多