Ios 奇怪的plist行为在第一个值返回null,当它应该是12时返回13

Ios 奇怪的plist行为在第一个值返回null,当它应该是12时返回13,ios,objective-c,plist,icarousel,Ios,Objective C,Plist,Icarousel,当使用plist并试图返回数据时,我有这种奇怪的行为。为了给你一个概览,plist在每个对象中有12个条目,所以我期望12个条目,但是我得到13个条目,第一个结果是null,而剩下的12个条目实际上是正确的 这是我的plist文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/Prope

当使用plist并试图返回数据时,我有这种奇怪的行为。为了给你一个概览,plist在每个对象中有12个条目,所以我期望12个条目,但是我得到13个条目,第一个结果是null,而剩下的12个条目实际上是正确的

这是我的plist文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Name</key>
    <array>
        <string>Audit</string>
        <string>Tax</string>
        <string>Digital</string>
        <string>Consulting</string>
        <string>Risk Advisory</string>
        <string>Finance</string>
        <string>Audit</string>
        <string>Tax</string>
        <string>Digital</string>
        <string>Consulting</string>
        <string>Advisory</string>
        <string>Finance</string>
    </array>
    <key>Logo</key>
    <array>
        <string>page.png</string>
        <string>page.png</string>
        <string>page.png</string>
        <string>page.png</string>
        <string>page.png</string>
        <string>page.png</string>
        <string>page.png</string>
        <string>page.png</string>
        <string>page.png</string>
        <string>page.png</string>
        <string>page.png</string>
        <string>page.png</string>
    </array>
</dict>
</plist>
awakeFromNib中for循环中包含的“第一个索引名”的输出为:

2013-05-21 22:43:23.875 Pack[7496:c07] First Index Name 0
2013-05-21 22:43:23.877 Pack[7496:c07] First Index Name 1
2013-05-21 22:43:23.878 Pack[7496:c07] First Index Name 2
2013-05-21 22:43:23.879 Pack[7496:c07] First Index Name 3
2013-05-21 22:43:23.880 Pack[7496:c07] First Index Name 4
2013-05-21 22:43:23.880 Pack[7496:c07] First Index Name 5
2013-05-21 22:43:23.881 Pack[7496:c07] First Index Name 6
2013-05-21 22:43:23.881 Pack[7496:c07] First Index Name 7
2013-05-21 22:43:23.882 Pack[7496:c07] First Index Name 8
2013-05-21 22:43:23.882 Pack[7496:c07] First Index Name 9
2013-05-21 22:43:23.883 Pack[7496:c07] First Index Name 10
2013-05-21 22:43:23.883 Pack[7496:c07] First Index Name 11
正如你所看到的,我得到了所有12个值的正确顺序,这是我对第二个值的期望,但这就是问题所在。对于包含在
-(UIView*)carousel:(iCarousel*)carousel view For itematIndex:(NSUInteger)index reusingView:(UIView*)view
中的第二个NSLog,我正在输出
items
数组,以查看发生了什么。这就是我所看到的:

2013-05-21 22:43:23.916 Pack[7496:c07] companyName: 0
2013-05-21 22:43:23.918 Pack[7496:c07] companyName: 0
2013-05-21 22:43:23.919 Pack[7496:c07] companyName: 11
2013-05-21 22:43:23.920 Pack[7496:c07] companyName: 7
2013-05-21 22:43:23.921 Pack[7496:c07] companyName: 6
2013-05-21 22:43:23.922 Pack[7496:c07] companyName: 2
2013-05-21 22:43:23.922 Pack[7496:c07] companyName: 1
2013-05-21 22:43:23.923 Pack[7496:c07] companyName: 10
2013-05-21 22:43:23.924 Pack[7496:c07] companyName: 9
2013-05-21 22:43:23.925 Pack[7496:c07] companyName: 8
2013-05-21 22:43:23.925 Pack[7496:c07] companyName: 5
2013-05-21 22:43:23.926 Pack[7496:c07] companyName: 4
2013-05-21 22:43:23.927 Pack[7496:c07] companyName: 3
同样,前两个结果都是
0
,并且排序与第一次迭代不同,非常混乱。我提到了plist不一定按顺序输出,因为它们只是关键对象,所以我知道了,但核心问题是前两个结果

如果我更改NSLog以输出
self.packName
(如下所示:
NSLog(@“companyName:%@,[self.packName objectAtIndex:index]);
)返回的结果如下:

2013-05-21 22:49:43.663 Pack[7543:c07] companyName: (null)
2013-05-21 22:49:43.665 Pack[7543:c07] companyName: Audit
2013-05-21 22:49:43.666 Pack[7543:c07] companyName: Finance
2013-05-21 22:49:43.667 Pack[7543:c07] companyName: Tax
2013-05-21 22:49:43.668 Pack[7543:c07] companyName: Audit
2013-05-21 22:49:43.669 Pack[7543:c07] companyName: Digital
2013-05-21 22:49:43.669 Pack[7543:c07] companyName: Tax
2013-05-21 22:49:43.670 Pack[7543:c07] companyName: Risk Advisory
2013-05-21 22:49:43.671 Pack[7543:c07] companyName: Consulting
2013-05-21 22:49:43.672 Pack[7543:c07] companyName: Digital
2013-05-21 22:49:43.672 Pack[7543:c07] companyName: Finance
2013-05-21 22:49:43.673 Pack[7543:c07] companyName: Risk Advisory
2013-05-21 22:49:43.673 Pack[7543:c07] companyName: Consulting
正如您再次看到的,第一个结果是
(null)
,我不明白为什么会发生这种情况

为了进一步调试,我运行了这个NSLog:
NSLog(@“companyName:%@”,packName)
以数组形式输出原始结果,结果如下:

2013-05-21 22:52:59.284 Pack[7581:c07] companyName: (
    "Audit",
    "Tax",
    "Digital",
    "Consulting",
    "Risk Advisory",
    "Finance",
    "Audit",
    "Tax",
    "Digital",
    "Consulting",
    "Advisory",
    "Finance"
)
数组中没有
(null)
结果,因此我不知道这个恶意null值来自何处

任何帮助都将不胜感激

对于包含在
carousel:viewForItemAtIndex:reusingView:
中的第二个NSLog,我正在输出items数组,以查看发生了什么

不,您只输出了
项的一个元素
:在iCarousel委托回调中传递了索引的元素。您无法控制iCarousel何时发送此消息,并且未指定索引的顺序。这就解释了下面的输出

2013-05-21 22:43:23.916 Pack[7496:c07] companyName: 0
2013-05-21 22:43:23.918 Pack[7496:c07] companyName: 0
2013-05-21 22:43:23.919 Pack[7496:c07] companyName: 11
...
同样,前两个结果都是0,并且与第一次迭代不同,排序非常混乱。我发现了一个线程,其中提到plist不一定按顺序输出,因为它们只是关键对象,所以我得到了这一点,但核心问题是前两个结果

如前所述,顺序取决于iCarousel的实施。这与夹缝无关。你误读了链接的帖子,可能是因为字典的顺序。当然,plist保留数组元素顺序

如果我更改NSLog以输出self.packName的结果(如:NSLog(@“companyName:%@,[self.packName objectAtIndex:index]),则返回的结果如下:

2013-05-21 22:49:43.663 Pack[7543:c07] companyName: (null)
2013-05-21 22:49:43.665 Pack[7543:c07] companyName: Audit
2013-05-21 22:49:43.666 Pack[7543:c07] companyName: Finance
2013-05-21 22:49:43.667 Pack[7543:c07] companyName: Tax
2013-05-21 22:49:43.668 Pack[7543:c07] companyName: Audit
2013-05-21 22:49:43.669 Pack[7543:c07] companyName: Digital
2013-05-21 22:49:43.669 Pack[7543:c07] companyName: Tax
2013-05-21 22:49:43.670 Pack[7543:c07] companyName: Risk Advisory
2013-05-21 22:49:43.671 Pack[7543:c07] companyName: Consulting
2013-05-21 22:49:43.672 Pack[7543:c07] companyName: Digital
2013-05-21 22:49:43.672 Pack[7543:c07] companyName: Finance
2013-05-21 22:49:43.673 Pack[7543:c07] companyName: Risk Advisory
2013-05-21 22:49:43.673 Pack[7543:c07] companyName: Consulting
带有(null)结果的行只能表示一件事:在第一次回调时,
ivar尚未初始化
objectAtIndex:
永远不能返回
nil
,因此这是唯一的解释。您可以使用调试器检查,在回调和
awakeFromNib
中设置断点

对于包含在
carousel:viewForItemAtIndex:reusingView:
中的第二个NSLog,我正在输出items数组,以查看发生了什么

不,您只输出了
项的一个元素
:在iCarousel委托回调中传递了索引的元素。您无法控制iCarousel何时发送此消息,并且未指定索引的顺序。这就解释了下面的输出

2013-05-21 22:43:23.916 Pack[7496:c07] companyName: 0
2013-05-21 22:43:23.918 Pack[7496:c07] companyName: 0
2013-05-21 22:43:23.919 Pack[7496:c07] companyName: 11
...
同样,前两个结果都是0,并且与第一次迭代不同,排序非常混乱。我发现了一个线程,其中提到plist不一定按顺序输出,因为它们只是关键对象,所以我得到了这一点,但核心问题是前两个结果

如前所述,顺序取决于iCarousel的实施。这与夹缝无关。你误读了链接的帖子,可能是因为字典的顺序。当然,plist保留数组元素顺序

如果我更改NSLog以输出self.packName的结果(如:NSLog(@“companyName:%@,[self.packName objectAtIndex:index]),则返回的结果如下:

2013-05-21 22:49:43.663 Pack[7543:c07] companyName: (null)
2013-05-21 22:49:43.665 Pack[7543:c07] companyName: Audit
2013-05-21 22:49:43.666 Pack[7543:c07] companyName: Finance
2013-05-21 22:49:43.667 Pack[7543:c07] companyName: Tax
2013-05-21 22:49:43.668 Pack[7543:c07] companyName: Audit
2013-05-21 22:49:43.669 Pack[7543:c07] companyName: Digital
2013-05-21 22:49:43.669 Pack[7543:c07] companyName: Tax
2013-05-21 22:49:43.670 Pack[7543:c07] companyName: Risk Advisory
2013-05-21 22:49:43.671 Pack[7543:c07] companyName: Consulting
2013-05-21 22:49:43.672 Pack[7543:c07] companyName: Digital
2013-05-21 22:49:43.672 Pack[7543:c07] companyName: Finance
2013-05-21 22:49:43.673 Pack[7543:c07] companyName: Risk Advisory
2013-05-21 22:49:43.673 Pack[7543:c07] companyName: Consulting

带有(null)结果的行只能表示一件事:在第一次回调时,
ivar尚未初始化
objectAtIndex:
永远不能返回
nil
,因此这是唯一的解释。您可以使用调试器检查,在回调中设置断点,并
awakeFromNib

感谢@Nikolai Ruhe将我引导到正确的方向。如果你看一下我上面的代码,你会发现在
viewDidLoad
awakeFromNib
中,我两次拉plist。修复方法是合并此文件,将plist代码放在
awakeFromNib
中,并将其从
viewDidLoad
中删除。感谢@Nikolai Ruhe将我引导到正确的方向。如果你看一下我上面的代码,你会发现在
viewDidLoad
awakeFromNib
中,我两次拉plist。修复方法是合并该文件,将plist代码放在
awakeFromNib
中,并将其从
viewDidLoad
中删除。
2013-05-21 22:49:43.663 Pack[7543:c07] companyName: (null)
2013-05-21 22:49:43.665 Pack[7543:c07] companyName: Audit
...