2013-02-05 59 views
11

मैं एक वेनिला आईपैड ही दृश्य अनुप्रयोग के viewDidLoad समारोह में निम्न कोड चल रहा हूँ:एनएसएलओजी कभी-कभी यूकोड वर्णों के लिए ऑक्टल प्रिंट क्यों करता है?

/* 
* Print the string. A lot. 
*/ 
for (int i = 0; i < 300; i++) { 
    NSLog(@"%d\n", i); 
    NSLog(@"⊢ ⊣ ⊥ ⊻ ⊼ ⊂ ⊃ ⊑ ⊒ \n"); 
} 

उत्पादन इस तरह दिखता है:

2013-02-04 20:17:49.718 testplay[59585:c07] 228 
2013-02-04 20:17:49.718 testplay[59585:c07] ⊢ ⊣ ⊥ ⊻ ⊼ ⊂ ⊃ ⊑ ⊒ 
2013-02-04 20:17:49.719 testplay[59585:c07] 229 
2013-02-04 20:17:49.719 testplay[59585:c07] ⊢ ⊣ ⊥ ⊻ ⊼ ⊂ ⊃ ⊑ ⊒ 
2013-02-04 20:17:49.719 testplay[59585:c07] 230 
2013-02-04 20:17:49.720 testplay[59585:c07] ⊢ ⊣ ⊥ ⊻ ⊼ ⊂ ⊃ ⊑ ⊒ 
2013-02-04 20:17:49.720 testplay[59585:c07] 231 
2013-02-04 20:17:49.720 testplay[59585:c07] ⊢ ⊣ ⊥ ⊻ ⊼ ⊂ ⊃ \342\212\221 ⊒ 
2013-02-04 20:17:49.723 testplay[59585:c07] 232 
2013-02-04 20:17:49.724 testplay[59585:c07] ⊢ ⊣ ⊥ ⊻ ⊼ ⊂ ⊃ ⊑ ⊒ 

अष्टाधारी एक ही चरित्र पर लगभग हमेशा होता है और हिचकी प्रति रन लगभग 3 गुना यादृच्छिक रूप से होती है।

जबकि यह NSLog() में अपेक्षाकृत हानिकारक है, यह दर्शाता है कि यूनिकोड वर्णों को कुछ स्तर पर अनियमित रूप से निपटाया जा सकता है। अगर इस व्यवहार या कुछ संसाधनों का इतिहास है तो मैं देख सकता हूं कि यह बहुत अच्छा होगा।

[अनुपूरक: इस समस्या को पार करने के संदर्भ में हटाया गया संदर्भ। समझना क्यों और कैसे NSLog यूनिकोड वर्ण का विकृत पढ़ने हो जाता है मुझे आशा है यहाँ]

+0

एनएसएलओजी व्यवहार दिलचस्प है (और पुनरुत्पादित)। हालांकि तुलनात्मक पुनरावृत्तियों के लिए कोड को बदलना विसंगतिपूर्ण तारों का कारण नहीं बनता है। यह उपयोगी होगा यदि आपने तुलनात्मक विधि पोस्ट की है जो वास्तव में आपको समस्याएं उत्पन्न करती है ('तुलना करें: ',' isEqualToString: ',' ​​तुलना करें: विकल्प: ', आदि) –

उत्तर

8

लघु संस्करण:।

मुझे लगता है कि ऐसा होता है, तो एक NSLog() उत्पादन का एक UTF-8 अनुक्रम का क्या होता है छद्म-टर्मिनल के बफर की सीमा पर गिरें जो एक्सकोड डीबग प्रक्रिया के मानक त्रुटि के लिए उपयोग करता है।

यदि मेरी धारणा सही है, तो यह केवल एक्सकोड डीबगर आउटपुट की समस्या है और एप्लिकेशन में कोई यूनिकोड समस्या नहीं दर्शाती है।

लांग संस्करण:

आप सिम्युलेटर में अपने अनुप्रयोग चलाते हैं, lsof -p <pid_of_simulated_app> पता चलता है कि मानक त्रुटि (फ़ाइल वर्णनकर्ता 2) एक छद्म टर्मिनल के लिए भेज दिया जाएगा:

# lsof -p 3251 
... 
testplay 3251 martin 2w  CHR    16,2  0t131  905 /dev/ttys002 
... 

और lsof -p <pid_of_Xcode> दिखाता है कि एक्सकोड में एक ही छद्म-टर्मिनल खुला है:

# lsof -p 3202 
... 
Xcode 3202 martin 51u  CHR    16,2  0t0  905 /dev/ttys002 
... 

NSLog() मानक त्रुटि को लिखता है। सिस्टम कॉल ट्रैसर "dtruss" के साथ कोई देख सकता है कि एक्सकोड छद्म-टर्मिनल से लॉग संदेश पढ़ता है। एक भी लॉग संदेश के लिए

NSLog(@"⊢ ⊣ ⊥ ⊻ ⊼ ⊂ ⊃ ⊑ ⊒ \n"); 

यह इस तरह दिखता है:

# dtruss -n Xcode -t read_nocancel 
3202/0xe101: read_nocancel(0x31, "2013-02-05 08:57:44.744 testplay[3251:11303] \342\212\242 \342\212\243 ... \342\212\222 \n\0", 0x8000)  = 82 0 

लेकिन कई NSLog() बयानों के लिए, तेजी से एक दूसरे को निम्नलिखित कभी कभी निम्न होता है:

# dtruss -n Xcode -t read_nocancel 
... 
3202/0xd828: read_nocancel(0x33, "2013-02-05 08:39:51.156 ...", 0x8000) = 1024 0 
3202/0xd87b: read_nocancel(0x33, "\212\273 \342\212\274 ...", 0x8000) = 24 0 

आप देख सकते हैं , एक्सकोड ने छद्म टर्मिनल से 1024 बाइट्स पढ़े हैं, और अगले पढ़ने एक अपूर्ण यूटीएफ -8 अनुक्रम के साथ शुरू होता है। इस मामले में, एक्सकोड "नहीं देखता" है कि पहले पढ़ने के अंतिम बाइट और दूसरे पढ़ने के पहले दो बाइट के समान यूटीएफ -8 अनुक्रम के भाग हैं। मुझे लगता है कि एक्सकोड सभी 3 बाइट्स को अवैध यूटीएफ -8 अनुक्रम के रूप में मानता है और उन्हें ऑक्टल संख्याओं के रूप में प्रिंट करता है।

+0

यह एक बहुत ही आकर्षक स्पष्टीकरण है। यह बिल्कुल समझा नहीं जाता है कि यह आमतौर पर एक ही चरित्र क्यों होता है लेकिन मुझे लगता है कि सुरक्षित रूप से बफरिंग और प्रक्रिया समय की अनियमितताओं के लिए सुरक्षित रूप से तैयार किया जा सकता है। धन्यवाद! –

0

आपके लूप में एक वर्कअराउंड, एक "fflush (stderr) डालें;" दूसरे एनएसएलओजी कथन के बाद; यह जारी रखने से पहले बफर को प्रतिबद्ध और लिखने के लिए मजबूर करेगा।

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

  • कोई संबंधित समस्या नहीं^_^