ios - How can i implement the same behaviour as in cluster pattern by apple (NSString and NSCFString) -
मैं परीक्षण प्रयोजन के लिए बस निम्नलिखित कोड लिख रहा हूं:
NSString * aStr = [ [NSString alloc] initWithFormat: @ "Foo"]; एएसटीआर = [एएसटीटी इनटविथ फॉर्मेट: @ "बार"]; // यहां क्रैश हो गया
मुझे निम्न त्रुटि मिल रही है:
*** प्रारंभिकरण विधि - InitWithFormat: लोकेल: तर्क: वर्ग के एक सार वस्तु को नहीं भेजा जा सकता __NSCFString: एक ठोस उदाहरण बनाएँ!
अगर मैं निम्नलिखित कोड लिखता हूं तो ऐसा ही होता है
NSString * aStr = [NSString alloc]; AStr = [aStr initWithFormat: @ "Foo"]; AStr = [aStr initWithFormat: @ "बार"]; // यहाँ दुर्घटनाग्रस्त
Google से मुझे पता चला कि initWithFormat
वापस NSCFString
ऑब्जेक्ट वापस करेगा। मेरा प्रश्न यह है कि यदि NSCFString
को NSString
वर्ग से प्राप्त किया गया है, तो मैं initWithFormat
विधि को NSCFString
पर क्यों नहीं ला सकता? यदि दृश्यता को रोकना संभव है तो मैं कोड में बिना किसी कोड को कैसे लागू कर सकता हूँ NSCFString
(डिवाइटेड क्लास)।
सरल शब्द में यदि NSCFString NSString तो क्यों मैं उस आधार पर आधार वर्ग (initWithFormat) विधि को कॉल नहीं कर सकता?
मुझे विश्वास है कि जो कुछ हो रहा है वह है कि [NSString initWithFormat:]
विधि यह देख रही है कि आपने कोई प्रारूप विनिर्देशक नहीं प्रदान किया है, इसलिए कोई भी NSString
ऑब्जेक्ट नहीं है जो निर्माण की आवश्यकता है, इसलिए यह केवल निरंतर <कोड > NSString ऑब्जेक्ट जो आप पास करते हैं ( @ "Foo"
):
NSString * aStr = [NSString alloc]; AStr = [aStr initWithFormat: @ "Foo"];
तो aStr
अब प्रकार NSCFString
है। यह दुर्घटना का कारण है:
aStr = [aStr initWithFormat: @ "बार"]; // यहां दुर्घटनाग्रस्त
हालांकि, किसी मौजूदा ऑब्जेक्ट पर आपको init
विधि नहीं बुलाया जाना चाहिए, इसलिए क्रैश उपयोग को सही करने के लिए:
aStr = [[NSString alloc] initWithFormat: @ "बार"];
और प्रारूप विनिर्देशक का उपयोग करें, जैसा आप कर सकते हैं:
aStr = @ "Foo"; AStr = @ "बू";
जो एक ही बात केवल स्पष्ट है, कम कोड का उपयोग करता है और बेहतर प्रदर्शन होता है।
Comments
Post a Comment