iOS 7 arrayWithContentsOfFile与plist返回导致类型无效

时间:2013-10-12 20:02:08

标签: ios objective-c nsarray ios7

我有这段代码

@implementation LevelManager {
    NSArray * levelPacks;
}

- (id)init {
    if ((self = [super init])) {
        NSString *file = [[NSBundle mainBundle] pathForResource:@"Levels" ofType:@"plist"];
        levelPacks = [NSArray arrayWithContentsOfFile:file];
    }
}

读取以下名为Levels.plist

的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">
<array>
    <dict>
        <key>PackName</key>
        <string>First Pack</string>
        <key>Levels</key>
        <array>
            <dict>
                <key>Name</key>
                <string>1</string>
                <key>Time</key>
                <integer>60</integer>
                <key>ScoreBronze</key>
                <integer>20</integer>
                <key>ScoreSilver</key>
                <integer>25</integer>
                <key>ScoreGold</key>
                <integer>30</integer>
                <key>Fish</key>
                <dict>
                    <key>OrangeFish</key>
                    <dict>
                        <key>Rarity</key>
                        <integer>1</integer>
                        <key>MinTime</key>
                        <integer>0</integer>
                    </dict>
                </dict>
            </dict>
            <dict>
                <key>Name</key>
                <string>2</string>
                <key>Time</key>
                <integer>60</integer>
                <key>ScoreBronze</key>
                <integer>25</integer>
                <key>ScoreSilver</key>
                <integer>30</integer>
                <key>ScoreGold</key>
                <integer>35</integer>
                <key>Fish</key>
                <dict>
                    <key>OrangeFish</key>
                    <dict>
                        <key>Rarity</key>
                        <integer>4</integer>
                        <key>MinTime</key>
                        <integer>0</integer>
                    </dict>
                    <key>PurpleFish</key>
                    <dict>
                        <key>Rarity</key>
                        <integer>2</integer>
                        <key>MinTime</key>
                        <integer>10</integer>
                    </dict>
                </dict>
            </dict>
        </array>
    </dict>
    <dict>
        <key>PackName</key>
        <string>Second Pack</string>
        <key>Levels</key>
        <array>
            <dict>
                <key>Name</key>
                <string>1</string>
                <key>Time</key>
                <integer>60</integer>
                <key>ScoreBronze</key>
                <integer>20</integer>
                <key>ScoreSilver</key>
                <integer>25</integer>
                <key>ScoreGold</key>
                <integer>30</integer>
                <key>Fish</key>
                <dict>
                    <key>OrangeFish</key>
                    <dict>
                        <key>Rarity</key>
                        <integer>5</integer>
                        <key>MinTime</key>
                        <integer>0</integer>
                    </dict>
                    <key>PurpleFish</key>
                    <dict>
                        <key>Rarity</key>
                        <integer>3</integer>
                        <key>MinTime</key>
                        <integer>0</integer>
                    </dict>
                    <key>YellowFish</key>
                    <dict>
                        <key>Rarity</key>
                        <integer>1</integer>
                        <key>MinTime</key>
                        <integer>0</integer>
                    </dict>
                </dict>
            </dict>
        </array>
    </dict>
</array>
</plist>

这一直有效,直到我的代码更新到iOS 7,现在我得到一个包含两个类型invalid的数组。

在xcode中检查变量时,它显示错误

(<invalid>) [0] = <error: expected ']'
error: 1 errors parsing expression
>

有人知道这是为什么吗?

2 个答案:

答案 0 :(得分:2)

我如图所示复制了plist,使用Xcode 5将其放入新项目的文件中,然后在iOS7模拟器中运行它。它工作正常 - 我可以在一个数组中看到两个字典。

建议:

  • 该文件因不可打印的字符而损坏,但当您将其粘贴到SO中时,它们就会消失

  • 文件类型为UTF-16或UTF-8以外的其他类型。查看Xcode,右侧Inspector窗格(或我们要查询的终端)。

您可以通过删除原始文件,然后创建一个新文件并将帖子中的文本粘贴到其中来解决问题。请注意,Xcode抱怨空plist文件的时间很长,因此您可能希望在终端等中执行此操作,然后将该文件添加到Xcode。

答案 1 :(得分:1)

这似乎是一个非常古老的Xcode错误。执行NSLog转储以查看值是否存在。这个检查员即使在Xcode 6.1中也不起作用!我会做一个雷达。