2015-07-03 10 views
6

मैं नीचेतेज सेटर के कारण EXC_BAD_ACCESS

import Foundation 

public class UsefulClass: NSObject{ 
    var test:NSNumber{ 
     get{return self.test} 
     set{ 
      println(newValue) 
      self.test = newValue 
     } 
    } 
    override init() { 
     super.init() 
     self.test = 5; 
    } 
} 

एक साधारण वर्ग है और मैं इसे यहाँ आरंभ कर रहा हूँ

import UIKit 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     var testClass = UsefulClass() 
    } 
} 

लेकिन यह EXC_BAD_ACCESS कोड की वजह से बाहर मुद्रण 200 5s और फिर दुर्घटनाग्रस्त xcode में जो परिणाम = 2. ऐसा क्यों होता है?

उत्तर

7

@vadian उसके जवाब में एक समाधान है, जो आपकी समस्या को ठीक करना चाहिए प्रदान की गई है कॉल बुला। मुझे बस बताएं कि क्या हो रहा है।

आपने एक गणना की गई संपत्ति बनाई है, यानी एक ऐसी संपत्ति जो एक चर द्वारा समर्थित नहीं है, बल्कि गेटटर और सेटर दोनों प्रोसेसिंग करते हैं, आमतौर पर एक अन्य संग्रहित संपत्ति पर, क्रमशः एक मूल्य वापस करने और एक नया सेट करने के लिए मूल्य।

यह आपके गणना संपत्ति है:

return self.test 

यह क्या करता है: गेटर कार्यान्वयन पर

var test: NSNumber { 
    get { return self.test } 
    set { 
     println(newValue) 
     self.test = newValue 
    } 
} 

देखो? यह वर्तमान उदाहरण की test संपत्ति पढ़ता है, और इसे वापस करता है। test संपत्ति कौन सा है? यह यह है:

var test: NSNumber { 
    get { return self.test } 
    set { 
     println(newValue) 
     self.test = newValue 
    } 
} 

हाँ, यह वही संपत्ति है। आपका गेटटर क्या करता है, जब तक कि रनटाइम पर कोई दुर्घटना न हो, तब तक खुद को कॉल करना और अनिश्चित काल तक कॉल करना।

यही नियम सेटर पर लागू होता है:

self.test = newValue 

यह अपने आप लागू रहता है, जब तक एप्लिकेशन क्रैश।

+0

मैं देख रहा हूँ, इसलिए स्विफ्ट में सेटर ओवरराइड करने के लिए सेट की तरह कुछ करने के लिए कोई रास्ता नहीं है - एक और संग्रहीत संपत्ति के बिना {self.test = newValue 7}? – user3211122

+0

ओह nvm, http://stackoverflow.com/questions/24006234/what-is-the-purpose-of-willset-and-didset-in-swift वास्तव में मददगार था। इसलिए सेट/प्राप्त करें केवल विधियां हैं और किया गया हैसेट/इन्स से बंधे हैं। – user3211122

3

स्विफ्ट चर डिफ़ॉल्ट रूप से गुण संश्लेषित कर रहे हैं। ज्यादातर मामलों में इस के लिए पर्याप्त है में

var test: Int 

override init() { 
    super.init() 
    test = 5 
} 

आप के बाद एक चर सेट किया गया है कुछ करने के लिए की जरूरत है,

var test: Int { 
    didSet{ 
     println("\(oldValue) - \(newValue)") 
    } 
} 

का उपयोग अपने कोड से चर स्थायी रूप से सेट (यह स्विफ्ट प्रकार पसंद करते हैं करने के लिए अनुशंसा की जाती है) सेटर जो सेटर जो ...