के लिए dispatch_once के साथ एक सिंगलटन क्लास बनाना मेरे पास 2 बाल वर्ग हैं जो 'MyClass' से प्राप्त होते हैं और प्रत्येक बाल वर्ग को सिंगलटन होना चाहिए।कक्षा hiearchy
मैं एक स्थिर उदाहरण प्राप्त करने के लिए इस पद्धति का उपयोग किया है मैं विरासत में किसी भी अन्य वर्गों की जरूरत नहीं है जब:
+ (MyClass *)getInstance
{
static dispatch_once_t once;
static MyClass *instance;
dispatch_once(&once, ^{
instance = [[MyClass alloc] init];
});
return instance;
}
यह काम करता है सिर्फ महान। अब, यदि मैं दो नए बाल वर्ग, फर्स्ट क्लास और सेकेंड क्लास जोड़ता हूं, जिनमें से दोनों MyClass से प्राप्त होते हैं, तो मैं कैसे सुनिश्चित करूं कि मैं संबंधित बाल क्लास वापस प्राप्त करूं?
dispatch_once(&once, ^{
// No longer referencing 'MyClass' and instead the correct instance type
instance = [[[self class] alloc] init];
});
FirstClass *firstClass = [FirstClass getInstance]; // should be of FirstClass type
SecondClass *secondClass = [SecondClass getInstance]; // should be of SecondClass type
ऊपर कर मतलब यह है कि मैं हमेशा वापस पाने के लिए जो भी वर्ग मैं अपने द्वितीय श्रेणी प्रकार के रूप में 1 instantiated:
first: <FirstClass: 0x884b720>
second: <FirstClass: 0x884b720>
// Note that the address and type as identical for both.
को getInstance
विधि जोड़ने के बिना संबंधित बच्चे वर्ग एकमात्र बनाने के लिए सबसे अच्छा तरीका क्या है प्रत्येक बच्चे वर्ग?
मेरे पास इस पदानुक्रम का कारण यह है कि मेरे पास साझा साझा कोड और डेटा की संख्या है जो मेरे सभी बच्चों के वर्गों में (साझा किए गए 'के बाहर है। यही कारण है कि मैं विरासत बनाम प्रोटोकॉल का उपयोग कर रहा हूं। मैं भी चाहता था व्युत्पन्न कक्षाओं के सभी तीनों के लिए एक ही तत्काल कोड दोहराएं। –
"प्राप्त करें" नामकरण के बारे में +1। –