不安全的可变地址崩溃

时间:2017-04-07 13:16:40

标签: swift

我有一个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作为错误进行搜索无效,因为几乎没有结果。

3 个答案:

答案 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();
}
}