我有一个struct
,有时候,对于某些用户来说,尝试访问该类型的变量时会出现崩溃。
struct AppSettings {
var mute:Bool {
didSet {
if mute != oldValue {
let savedSettings = NSUserDefaults.standardUserDefaults()
savedSettings.setBool(mute, forKey: KEY_SETTING_MUTE)
}
}
}
init() {
let savedSettings = NSUserDefaults.standardUserDefaults()
if let savedMute = savedSettings.objectForKey(KEY_SETTING_MUTE) as? Bool {
mute = savedMute
} else {
mute = false
}
}
}
var appSettings = AppSettings()
在启动应用程序的某个地方,它有时会崩溃
if appSettings.mute { // This will sometimes cause a crash
} // in AppDelegate or the methods it calls
这仅适用于某些用户,我似乎无法重现它。不是为了重现它是最糟糕的,因为它让我没有任何工作。
将unsafe mutable addressor
作为错误进行搜索无效,因为几乎没有结果。
答案 0 :(得分:1)
我认为您的解决方案设计过度,难以理解或调试。几年来,我一直在我的应用程序中使用类似的解决方案来管理会话状态,并希望与您分享。您可以直接从这里提出并实施它,并且不会出现任何问题。
我在 Session 原则上工作,这意味着我希望存储和读取的值通过一个可靠的 Session 类并且没有错误的余地。
这是在应用程序的任何地方使用它的方式。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// how to set the value to be stored in userdefaults
Session.HasMuted = true
// two example of how to read the value
if Session.HasMuted == true {
print("has muted")
}
if Session.HasMuted == false {
print("has not muted")
}
}
这是会话类
class Session {
class var HasMuted: Bool {
get {
guard let HasMuted = UserDefaults.standard.object(forKey: SessionSpace.HasMuted) as? Bool else {
return false
}
return HasMuted
}
set {
UserDefaults.standard.set(newValue, forKey: SessionSpace.HasMuted)
}
}
}
以及随附的会话空间结构
struct SessionSpace {
static let HasMuted = "HasMuted"
}
我会考虑调整它以适合您的风格,我不是关键字符串等的大写字母的忠实粉丝,这是一个更优雅的可读性和实施和忘记解决方案。您可以通过在会话空间块中添加一个 setter/getter 块和键字符串来扩展它,并在几秒钟内从应用程序的任何地方再次使用它,知道它是无故障和健壮的。如果您需要更多帮助,请告诉我。希望您采用它并将其保存为片段。
答案 1 :(得分:0)
最好
使用
disp (['a :: ' num2str(a) ' :: b :: ' num2str(b)]
代替
init() {
let savedSettings = UserDefaults.standard
let savedMute = savedSettings.bool(forKey: KEY_SETTING_MUTE)
答案 2 :(得分:-1)
我更改了代码的某些部分并执行了。一切都好,没有崩溃。
public class StringUtils {
public static String repeat(String text, int numberOfIterations){
StringBuilder buffer = new StringBuilder(text.length()*numberOfIterations);
while(numberOfIterations-- > 0){
buffer.append(text);
}
return buffer.toString();
}
}