अनुपयोगी तरीकों और उद्देश्य-सी में #import का पता कैसे लगाएं


99

एक iPhone ऐप पर लंबे समय तक काम करने के बाद, मुझे एहसास हुआ कि मेरा कोड काफी गंदा है, जिसमें कई #import और तरीके हैं, जिन्हें बिल्कुल भी नहीं कहा जाता है या उपयोगी नहीं है।

मैं जानना चाहूंगा कि क्या कोड के उन बेकार लाइनों का पता लगाने के लिए कोई संकलक निर्देश या तरीका है। क्या Xcode के पास इसका पता लगाने के लिए कोई उपकरण है?

जवाबों:


66

Xcode आपको विशिष्ट संकलक चेतावनियों के लिए (un) चेक सेटिंग्स की अनुमति देता है जो आपको कुछ प्रकार के अप्रयुक्त कोड की चेतावनी दे सकता है। (स्रोत सूची में परियोजना का चयन करें और फ़ाइल> जानकारी प्राप्त करें, फिर बिल्ड टैब का चयन करें।) यहां कुछ हैं (जो मेरे लिए क्लैंग और जीसीसी 4.2 के लिए दिखाते हैं) जो रुचि के हो सकते हैं:

  • अप्रयुक्त कार्य
  • अप्रयुक्त पैरामीटर
  • अप्रयुक्त मूल्य

मुझे अप्रयुक्त आयातों का पता लगाने के लिए कोई विकल्प नहीं दिखता है, लेकिन यह थोड़ा सरल है - कम-तकनीकी दृष्टिकोण आयात बयानों को टिप्पणी करने के लिए है जब तक कि आपको एक संकलन त्रुटि / चेतावनी नहीं मिलती है।

अप्रयुक्त उद्देश्य-सी विधियां अप्रयुक्त सी फ़ंक्शन की तुलना में पता लगाने में अधिक कठिन हैं क्योंकि संदेश गतिशील रूप से भेजे जाते हैं। एक चेतावनी या त्रुटि आपको बता सकती है कि आपके पास एक संभावित समस्या है, लेकिन एक की कमी यह गारंटी नहीं देती है कि आपके पास रनटाइम त्रुटियाँ नहीं होंगी।


संपादित करें: (संभावित) अप्रयुक्त विधियों का पता लगाने का एक और अच्छा तरीका वास्तविक निष्पादन से कोड कवरेज की जांच करना है। यह आमतौर पर स्वचालित इकाई परीक्षण के साथ मिलकर किया जाता है, लेकिन होना नहीं चाहिए।

यह ब्लॉग पोस्ट Xcode का उपयोग करके यूनिट परीक्षण और कोड कवरेज का एक अच्छा परिचय है। पर अनुभाग gcov(जो केवल GCC द्वारा उत्पन्न कोड के साथ काम करता है, वैसे) यह बताता है कि साधन कोड बनाने के लिए Xcode कैसे प्राप्त करें जो यह रिकॉर्ड कर सकता है कि इसे कितनी बार निष्पादित किया गया है। यदि आप सिम्युलेटर में एक स्पिन के लिए अपने ऐप का इंस्ट्रूमेंटेड बिल्ड लेते हैं, तो उस पर gcov चलाएं, आप देख सकते हैं कि CoverStory (एक काफी सरल जीयूआई) या lcov(HTML रिपोर्ट बनाने के लिए पर्ल स्क्रिप्ट ) जैसे टूल का उपयोग करके किस कोड को निष्पादित किया गया था ।

मैं का उपयोग करें gcovऔर lcovके लिए CHDataStructures.framework और स्वत: जनरेट कवरेज रिपोर्ट प्रत्येक SVN के बाद करते हैं। फिर से, याद रखें कि निष्पादित कवरेज को एक निश्चित उपाय के रूप में समझना ठीक नहीं है कि कोड "मृत" है, लेकिन यह निश्चित रूप से उन तरीकों की पहचान करने में मदद कर सकता है जिनकी आप आगे जांच कर सकते हैं।

अंत में, चूंकि आप मृत कोड को हटाने की कोशिश कर रहे हैं, मुझे लगता है कि आपको यह SO प्रश्न दिलचस्प लगेगा:


4
मुझे यकीन नहीं है कि आपकी बात क्या है ... स्थिर विश्लेषक बहुत सारी समस्याएं पा सकता है, लेकिन यदि आप किसी संदेश को टाइप किए गए चर पर भेजते हैं id, या रनटाइम पर कॉल करने के लिए चयनकर्ता बनाते हैं, तो स्थिर विश्लेषक गारंटी नहीं दे सकता है कोड वास्तव में अप्रयुक्त है। यदि अभी भी आवश्यक कोड हटा दिया गया है, तो आपको रनटाइम त्रुटियाँ मिलेंगी। क्या मैं कुछ भूल रहा हूँ?
क्विन टेलर

1
इसके अलावा, चयनकर्ता जो रनटाइम के आधार पर बनाए जाते हैं, काफी सामान्य हैं।
ड्रीमलैक्स

1
बेशक, ऐसे मामले हैं जहां आपके डायनामिक कोड को अधिक दृढ़ता से टाइप-कास्ट करके बेहतर तरीके से परोसा जा सकता है (यानी आईडी के बजाय कुछ लौटाएं)। रनटाइम टाइपिंग कोको / ऑब्जेक्टिव-सी प्रोग्रामिंग का एक मजबूत बिंदु है, लेकिन कभी-कभी मजबूत टाइपिंग के बारे में अधिक सोचने से रखरखाव और पठनीयता बेहतर होगी।
एल्पप्लिन

3
ओह, मैं निश्चित रूप से सहमत हूं। मेरे अंगूठे का नियम सांख्यिकीय रूप से टाइप करना है (जैसा कि मैं जावा में करूँगा) जब तक मुझे वास्तव में गतिशील टाइपिंग की आवश्यकता नहीं है, जो कि दुर्लभ है लेकिन अवसर पर होता है। हालांकि, कोको वर्गों (उदाहरण के लिए, एक प्रतिनिधि को निर्दिष्ट करने के लिए) के साथ अंतर केवल हार्ड-टू-ट्रेस गतिशीलता और निष्पादन के परिणाम हो सकते हैं। हेक, एक रन लूप और कई थ्रेड्स वाला कोई भी कार्यक्रम गैर-तुच्छ हो सकता है ...
क्विन टेलर

39

Appcode में एक कोड निरीक्षण सुविधा है जो अप्रयुक्त आयात और कोड को ढूंढती है।


18
तो, आपका मतलब है कि हमें इस सुविधा के लिए केवल Appcode स्थापित करना चाहिए?
Mayqiyue

यदि यह आपके लिए उपयोगी है, हाँ!
rmp251

8

हम कुछ देसी रूबी कोड का उपयोग कर रहे हैं, जिसे अब एक मणि में निकाला जाता है जिसे फुई कहा जाता है: https://github.com/dblock/fui


5

मैंने हाल ही में अप्रयुक्त (या डुप्लिकेट) #importकथनों को खोजने के लिए एक स्क्रिप्ट लिखी थी : https://gist.github.com/Orangenhain/2691414

स्क्रिप्ट ObjC .m फ़ाइल लेती है और प्रत्येक #importपंक्ति को बदले में देखना शुरू करती है और यह देखती है कि क्या परियोजना अभी भी संकलित है। आपको BUILD_DIR & BUILD_CMD को बदलना होगा।

यदि आप एक findकमांड का उपयोग कर रहे हैं , तो स्क्रिप्ट को कई फाइलों पर चलने दें, BUILD_CMD का उपयोग करना सुनिश्चित करें जो वास्तव में उन सभी फाइलों का उपयोग करता है (या आप बहुत सारे अप्रयुक्त आयात विवरणों वाली फाइल देखेंगे)।

मैंने लिखा है कि यह जानने के बिना कि AppCode में एक समान विशेषता है, हालांकि जब मैंने AppCode का परीक्षण किया तो यह इस स्क्रिप्ट के रूप में पूरी तरह से नहीं था (लेकिन तेजी से [एक पूरी परियोजना के लिए])।


यह केवल डुप्लिकेट के लिए काम कर रहा है, अप्रयुक्त आयातों को हटाया नहीं जा रहा है।
राहुल

3

जैसा कि धानदुब ने कहा, AppCode यह बहुत अच्छी तरह से करता है। मैंने कोशिश की, और मुझे सिर्फ 10 मिनट लगे:

जाओ Code > Optimize Imports..., या^ + ⌥ + O

यहाँ एक वीडियो है कि यह कैसे करना है: अप्रयुक्त आयात और AppCode में विधियों का पता लगाना


2

आप अन्य समस्याओं का पता लगाने के लिए Xcode विश्लेषक का उपयोग कर सकते हैं।

http://help.apple.com/xcode/mac/8.0/#/devb7babe820

इसके अलावा आप प्रोजेक्ट पर जा सकते हैं और बिल्ड को टारगेट कर सकते हैं और बिल्ड सेटिंग्स के तहत चेंज चेतावनी प्राथमिकताएं जोड़ सकते हैं। इस गाइड को देखें:

http://oleb.net/blog/2013/04/compiler-warnings-for-objective-c-developers/


1

हाल ही में, मैंने कार्बन से कोको तक एक बड़ी परियोजना को बदल दिया। इसके अंत में, कुछ अनाथ फाइलें थीं जो अब उपयोग नहीं की गई थीं। मैंने उन्हें खोजने के लिए एक स्क्रिप्ट लिखी थी कि अनिवार्य रूप से ऐसा किया था:

सुनिश्चित करें कि स्रोत सब तोड़फोड़ करने के लिए जाँच की गई है (यानी साफ) यह सुनिश्चित करें कि यह वर्तमान में त्रुटि के बिना बनाता है (यानी, xcodebuild रिटर्न 0 स्थिति) फिर, निर्देशिका में प्रत्येक स्रोत फ़ाइल के लिए, खाली (यानी, सामग्री को हटा दें, लंबाई को छोटा करें) स्रोत और हेडर फ़ाइल, एक बिल्ड का प्रयास करें, यदि यह विफल रहता है, तो फ़ाइलों को वापस कर दें, अन्यथा, उन्हें खाली छोड़ दें।

इसे चलाने के बाद, सभी खाली की गई फ़ाइलों को वापस लाएं और फिर हटाएं, संकलन करें और फिर सभी गलत #imports निकालें।

मुझे भी जोड़ना चाहिए, आपको उन फ़ाइलों से बचने की आवश्यकता है जो .xib या .sdef फ़ाइलों से संदर्भित हैं, और अन्य गतिशील लिंकिंग मामले भी हो सकते हैं, लेकिन यह अभी भी आपको एक अच्छा नेतृत्व दे सकता है जिसे हटा दिया जा सकता है।

एक ही तकनीक का उपयोग यह देखने के लिए किया जा सकता है कि किस #imports को हटाया जा सकता है - फ़ाइल को रौंदने के बजाय, फ़ाइल में प्रत्येक #import को बदले में निकालें और देखें कि क्या बिल्ड विफल रहता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.