2013-03-11 9 views
7

मेरे आवेदन में, किसी बिंदु पर, मुझे उचित रूप से उन्हें संभालने के लिए उत्परिवर्तनीय वस्तुओं की पहचान करने की आवश्यकता है। ऐसा लगता है कि यह तुलना में अधिक कठिन हो जाता है।उत्परिवर्तनीय वस्तुओं की पहचान कैसे करें?

यदि मैं पर isKindOfClass:[NSMutableString class] का उपयोग करता हूं, तो सभी तारों को उत्परिवर्तनीय प्रतीत होता है।

यदि मैं उनसे पूछता हूं कि वे @selector(appendString:) पर प्रतिक्रिया देते हैं या नहीं, तो वे सभी करते हैं।

अगर मैं वास्तव में उन्हें एक @try ... @catch ... @finally ब्लॉक में उत्परिवर्तित करने की कोशिश, सच पता चला है। हालांकि यह बहुत ही सुरुचिपूर्ण और बहुत धीमी है।

कार्रवाई का सबसे अच्छा तरीका क्या होगा?

+2

आपने पहले से ही 'isMemberOfClass [[NSMutableString class]] 'का उपयोग करने का प्रयास किया है? – s1m0n

+0

क्या आप यह पहचानने की कोशिश कर रहे हैं कि कक्षा वास्तव में 'NSMutableString' है या नहीं? यदि हां, तो क्या आपने 'isMemberOfClass: 'विधि का उपयोग करने का प्रयास किया है, जो कि' हाँ 'देता है यदि यह वास्तव में कक्षा का सदस्य है (लेकिन उप-वर्ग नहीं है)? –

+0

और हमेशा दिलचस्प दिलचस्प बीएनआर ब्लॉग देखें: [उत्परिवर्तन के बारे में] (http://blog.bignerdranch.com/803-about-mutability/) –

उत्तर

2

यदि आप उत्परिवर्तन को अनदेखा करना चाहते हैं, तो आप लूप के माध्यम से पुनरावृत्ति कर सकते हैं और -mutableCopy (जो कोई फर्क नहीं पड़ता, एनएसएमयूटेबलस्ट्रिंग बनाता है) के साथ प्रत्येक स्ट्रिंग की परिवर्तनीय प्रतियां बना सकता है। इसके विपरीत यह सच है: प्रत्येक ऑब्जेक्ट पर -copy भेजकर आपको एक अपरिवर्तनीय एनएसएसटींग प्राप्त करने की गारंटी है। दुर्भाग्यवश, एनएसएसटींग क्लास क्लस्टर होने के कारण, स्पष्ट रूप से परीक्षण योग्य अवधारणा नहीं है। उस @"__NSCFString" लाइन के साथ कक्षा के लिए जांच करना घृणित रूप से असुरक्षित है, क्योंकि ऐप्पल को अंतर्निहित कक्षा को किसी भी समय बदलने का अधिकार है।

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