2015-10-30 9 views
10

मैं नीचे दिए गए कोड में तरह lamdba के लिए क्रैश रिपोर्ट आने शुरू हो गए, नीचे ग्रे बॉक्स में तीसरी लाइन:स्विफ्ट 2.1, जगह में छँटाई केवल रिलीज पर त्रुटि बनाता

private func fixOverlaps(inout blocks: [TimeBlock], maxOverlaps: Int? = nil) { 
    blocks.sortInPlace { a,b in 
     if a.startTime < b.startTime { 
      return true 
     } else if a.startTime == b.startTime && a.endTime < b.endTime { 
      return true 
     } 
     return false 
    } 
... 

नोट दुर्घटना नहीं होती है डीबग पर एक्सकोड से बनाता है। केवल ऐप स्टोर और विज्ञापन संग्रह संग्रह दुर्घटनाग्रस्त हो जाएंगे, और तभी जब ब्लॉक सूची की लंबाई सैकड़ों में होगी।

मैं इस के लिए कोड को संशोधित किया है, और समस्या दूर चला गया:

private func fixOverlaps(inout blocks: [TimeBlock], maxOverlaps: Int? = nil) { 
    blocks = blocks.sort { a,b in 
     if a.startTime < b.startTime { 
      return true 
     } else if a.startTime == b.startTime && a.endTime < b.endTime { 
      return true 
     } 
     return false 
    } 
... 

वहाँ कुछ मैं कैसे inout का उपयोग करें या sortInPlace करने के बारे में नहीं छूटा है है? मैं इसका एक डेमो करने की कोशिश कर सकता हूं। यह आईओएस (8/9) और स्विफ्ट 2.1 के कई संस्करणों पर है।

संपादित --------------------

ठीक है यहाँ एक न्यूनतम संस्करण है कि दुर्घटनाओं है। बाहर निकलना एक लाल हेरिंग था। आप XCode 7.1 में एक नया ही दृश्य परियोजना शुरू, तो आप इस के साथ दृश्य नियंत्रक की जगह ले सकता:

class ViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    var blocks = [TimeBlock]() 
    for var i in 0...20 { //Works if you put in a small number like 8 
     let t = TimeBlock() 
     t.start = Int(arc4random_uniform(1000)) //Get some random numbers so the sort has to do some work 
     t.end = Int(arc4random_uniform(1000)) 
     blocks.append(t) 
    } 

    blocks.sortInPlace { a,b in 
     if a.start > b.start { 
      return true 
     } 
     return false 
    } 

    print("done") //Gets here on debug, not release 
} 

class TimeBlock { 
    var start = 0 
    var end = 0 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 

तो रिलीज में इसे चलाने, और आप इसे "हो गया" प्रिंट करता है, अगर आप के आसपास पर पाश अंत देखना चाहिए 17 लेकिन 20 के साथ दुर्घटनाग्रस्त हो। सटीक संख्या आपके लिए अलग हो सकती है।

+1

निश्चित रूप से ऐप्पल को रिपोर्ट करने के लिए एक: https://bugreport.apple.com –

+0

कोर प्रश्न से संबंधित नमूना कोड क्लीनअप: आपके 'sortInPlace' में 'if' अनावश्यक है, क्योंकि'> पहले से ही आपको एक बूलियन। आप बस {{a, b बदले में a.start> b.start} लिख सकते हैं। अभी भी सरल, आप '{$ 0.start> $ 1.start}' कर सकते हैं, क्योंकि '$ 0' का उपयोग कर वापसी को अंतर्निहित बनाता है। –

+0

@PaulCantrell अंत समय के बारे में क्या? क्या यह खुद को साफ करता है? – Carlos

उत्तर

3

यह कोड सही दिखता है। ऐसा लगता है जैसे आप कंपाइलर में एक बग में चला चुके हैं, जो आम तौर पर तब होता है जब आपके पास रिलीज कॉन्फ़िगरेशन में क्रैश होता है लेकिन डीबग नहीं होता है। आप शायद अपने डीबग बिल्ड और ऑप्टिमाइज़ेशन में अनुकूलन को सक्षम करके यह सत्यापित कर सकते हैं कि यह समस्या उत्पन्न करता है या नहीं। आपके कामकाज के अलावा, आपको केवल एक और चीज करने की आवश्यकता है file a bug

+0

मैं पेस्ट करूंगा कुछ मिनटों में एक काम (जिसे आप इसे कहते हैं) डेमो। मैंने इसे एक नई परियोजना पर पुन: पेश किया है। – Carlos

+0

वहां आप जाते हैं, एक परीक्षण है। – Carlos

4

यह एक्सकोड 7.1 में एक बग है। तेज़ से कंपाइलर ऑप्टिमाइज़ेशन स्तर को तेज़ी से चालू करने से मेरे लिए यह समस्या ठीक नहीं हुई है।

6

self.list.sortInPlace() के बजाय self.list = self.list.sort() का उपयोग कर कार्यक्षमता के नुकसान के बिना इसके आसपास काम किया।

3

मैंने आज के बारे में bug on bugs.swift.org लॉग इन किया और डेवलपर्स में से एक से त्वरित प्रतिक्रिया प्राप्त की कि यह वास्तव में एक्सकोड 7.1 के साथ एक मुद्दा है। उन्होंने बताया कि उसके समाधान Xcode 7.2 Release Notes में उल्लिखित है:

अनुकूलक में एक बग तय किया गया है कि परिवर्तनशील संग्रह पर यथा-स्थान प्रकार की वजह से दुर्घटना। (23081349)

तो Xcode 7.2 का उपयोग कर संकलित करने के लिए भी इस मुद्दे को ठीक करना चाहिए।

+1

ग्रेट। खुशी है कि यह सहायक था। पागल हो रहा था। – Carlos

संबंधित मुद्दे