gpt4 book ai didi

xcode - 非常不寻常的 Xcode 编译行为

转载 作者:可可西里 更新时间:2023-11-01 02:27:33 32 4
gpt4 key购买 nike

自从 Xcode 6.1 和 iOS 8.1 发布以来,我的一个应用程序停止运行了。仅当我使用“发布”而不是“调试”方案在我的设备上“运行”时,我才设法重现该问题。

现在是问题。这在 Debug模式下工作正常:

import Foundation

class CategoryParser {


var categoriesSettingsDictionary : [String: AnyObject]?


init() {
let categoriesURL = NSBundle.mainBundle().URLForResource("CategoriesSettings", withExtension: "plist")
categoriesSettingsDictionary = NSDictionary(contentsOfURL: categoriesURL!) as? Dictionary<String, AnyObject>
}
}

但是当我实例化 CategoryParser 类型的对象时,它会在“发布”模式下崩溃。经过多次试验和错误后,我认为要阻止它解决问题,我可以将字典初始化放在两个 println() 语句之间。为什么这些会有什么不同?

import Foundation

class CategoryParser {


var categoriesSettingsDictionary : [String: AnyObject]?


init() {
let categoriesURL = NSBundle.mainBundle().URLForResource("CategoriesSettings", withExtension: "plist")
println("_")
categoriesSettingsDictionary = NSDictionary(contentsOfURL: categoriesURL!) as? Dictionary<String, AnyObject>
println("_")
}
}

最佳答案

这一定是 Swift 编译器优化方面的错误。我认为,它围绕桥接 NSDictionaryDictionary<String,AnyObject> .

我通过以下设置重现了这个问题。


环境:Xcode 6.1 (6A1052d)/iPhone 6/iOS 8.1

模板:单 View 应用

CategoriesSettings.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>ct1</key>
<string>test</string>
</dict>
</plist>

AppDelegate.swift

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let result = loadPlist()
println("result: \(result)")
return true
}

func loadPlist() -> [String: AnyObject]? {
let categoriesURL = NSBundle.mainBundle().URLForResource("CategoriesSettings", withExtension: "plist")
let dict = NSDictionary(contentsOfURL: categoriesURL!)
println(dict)
let result = dict as? [String:AnyObject]
return result
}
}

// EOF

输出(使用 -O ):

Optional({
ct1 = test;
})
result: nil

输出(使用 -Onone ):

Optional({
ct1 = test;
})
result: Optional(["ct1": test])

不过,我不知道最好的解决方法。

也许这行得通:

class CategoryParser {
var categoriesSettingsDictionary : [String: AnyObject]?
init() {
let categoriesURL = NSBundle.mainBundle().URLForResource("CategoriesSettings", withExtension: "plist")
categoriesSettingsDictionary = NSDictionary(contentsOfURL: categoriesURL!) as? Dictionary<String, AnyObject>
if categoriesSettingsDictionary == nil {
// NOTICE: to other developers about this workaround
println("_")
println("_")
}
}
}

将它们封装在 autoreleasepool 中也有效:

class CategoryParser {
var categoriesSettingsDictionary : [String: AnyObject]?

init() {
autoreleasepool {
let categoriesURL = NSBundle.mainBundle().URLForResource("CategoriesSettings", withExtension: "plist")
self.categoriesSettingsDictionary = NSDictionary(contentsOfURL: categoriesURL!) as? Dictionary<String, AnyObject>
}
}
}

但是,截至目前,我认为您应该使用 NSDictionary照原样,因为只要你只读它,NSDictionary 之间几乎没有实际区别。和 Dictionary<String,AnyObject>在大多数情况下。

class CategoryParser {
var categoriesSettingsDictionary : NSDictionary?
init() {
let categoriesURL = NSBundle.mainBundle().URLForResource("CategoriesSettings", withExtension: "plist")
categoriesSettingsDictionary = NSDictionary(contentsOfURL: categoriesURL!)
}
}

或者,这可能过于激进,但您可以实现自己的 NSDictionaryDictionary转换器。

extension Dictionary {
init?(nsDictionaryOrNil:NSDictionary?) {
if let dict = nsDictionaryOrNil? {
self = [Key:Value](minimumCapacity: dict.count)
for (k,v) in dict {
if let key = k as? Key {
if let val = v as? Value {
self[key] = val
continue
}
}
return nil
}
}
else {
return nil
}
}
}

class CategoryParser {
var categoriesSettingsDictionary : [String:AnyObject]?
init() {
let categoriesURL = NSBundle.mainBundle().URLForResource("CategoriesSettings", withExtension: "plist")
let dict = NSDictionary(contentsOfURL: categoriesURL!)
categoriesSettingsDictionary = [String:AnyObject](nsDictionaryOrNil: dict)
}
}

关于xcode - 非常不寻常的 Xcode 编译行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26536244/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com