【问题标题】:Passing Null Values and a variable in to NSMutableArray/NSArray. Why is there a difference in output?将 Null 值和变量传递给 NSMutableArray/NSArray。为什么输出有差异?
【发布时间】:2016-03-03 10:08:15
【问题描述】:

我的问题是如何将 Null 值传递给 NSMutableArray/NSArray。

但是通过搜索谷歌和浏览不同的网站,我认为我已经达到了我的目的。但是,在尝试的过程中,我有了一个新的疑问。

查看下面的代码来理解我的问题

我正在声明一个可变数组并最初使用一些对象对其进行初始化,并且我在声明本身时将 null 传递给它。

现在当我在下面运行这段代码时

NSMutableArray * mar = [[NSMutableArray alloc]initWithObjects:@"first",@"last", nil];

[ar addObject:[NSNull null]];

NSLog(@"%@",mar); 

o/p 是:

(
    first,
    last,
    "<null>"
)

但我真正的疑问是当我如下初始化 NSMutableArray 时

NSString *str;

NSMutableArray * mar = [[NSMutableArray alloc]initWithObjects:@"first",str,@"last", nil];

[ar addObject:[NSNull null]];

NSLog(@"%@",mar); 

o/p 是:

(
    first,
    "<null>"
)

数组中的第二个元素是“null”,我知道因为我传递了一个变量而没有为其分配任何值。它正在打印空值。但是为什么剩下的元素没有打印出来。

据我所知,只要数组在初始化时克服了 nil,就会停止添加元素。但是在这里,在这种情况下。 o/p 显示第二个元素也是 null。(但不是 nil。)

那为什么剩下的元素没有打印出来。

更新问题

NSString* str;
NSLog(@"%@",str); 
NSMutableArray * mar = [[NSMutableArray alloc]initWithObjects:@"first",str,@"last", nil];

NSLog(@"%@",mar);

上面代码的o/p是

(null) // for str an uninitialised NSString variable.


(
    first // first element in the array
)

如果str中存在的值是(null),那么数组怎么会遇到nil并停止向数组添加元素并打印它们。

现在,有人回答这个问题吗?

【问题讨论】:

  • 你为什么不直接使用 "" ,一个空字符串。您可以在需要时为其赋值,如果要进行比较,可以使用if ans == ""
  • @Lee 是的,当然。我可以像你说的那样使用它来使程序正常工作。但我的问题不同。我的问题是,为什么当我传递一个变量而不分配任何值时它不能正常工作。
  • @Mahesh 第二个元素为空,因为您在记录之前将 [NSNull null] 添加到该行中
  • 在第二个示例中,str 在分配数组时为nil,因此它标志着初始对象列表的终止。实际上,您在初始化时只添加了一个元素。
  • @Avi 是的,你是对的。它解释了一切。但你应该已经回答了。而不是评论。

标签: ios objective-c arrays nsarray


【解决方案1】:

initWithObjects 使用nil 作为最后一项的标记。如果您将 nil(未初始化的 str 变量)作为 4 项中的第 2 项传递给它,则实际上只添加第一项。

[[NSMutableArray alloc]initWithObjects:@"first",str ?: [NSNull null],@"last", nil];

将通过将nil 替换为[NSNull null] 来解决您的问题。

另见NSArray creation with variable argument lists

【讨论】:

  • @Mahesh 老实说,我看不出与您原来的问题有什么不同。 str 仍然是nil 并且nil 仍然是参数列表结束的标记,因此所有其他项目都没有添加。 (null) 只是 nil 的字符串表示形式(参见 NSLog(@"%@", nil))。
  • 其实这个问题还没有更新,我想会的。但无论如何,你的这部分答案清除了我的疑问。 (null) 只是 nil 的字符串表示形式(参见 NSLog(@"%@", nil))
【解决方案2】:

在 Objective-C 中,当遍历数组时,如果遇到 nil/null 则它被视为数组的结尾。

这就是它不打印剩余值的原因。

如果您想明确 nil/null/Nil 之间的差异,请检查 Difference between nil, NIL and, null in Objective-C

【讨论】:

  • 完全完全错误。 Objective-C 数组从不 包含 nil,并且 [NSNull null] 不被视为数组的末尾。
  • @gasher729 当您在 xcode 中初始化数组时,您不会将最后一个对象设为 nil。这标志着数组的结束。并且有问题,请参考代码,他正在添加未初始化的 NSSTring 对象而不是 [NSNull null] ,这就是为什么数组在那里结束并且不打印下一个元素的原因。如果您同意,请不要投反对票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 2013-02-27
  • 1970-01-01
  • 2020-10-30
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多