6

मेरा प्रश्न के साथ काफी इस एक के समान है: Use Singleton In Interface Builder?इंटरफ़ेस बिल्डर में सिंगलटन एआरसी

फर्क सिर्फ इतना है कि मैं एआरसी का उपयोग करें। तो, अगर सरलीकृत, मेरी सिंगलटन कि तरह लग रहा है:

Manager.m

@implementation Manager 

+ (instancetype)sharedManager { 
    __strong static id sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 

@end 

तो सवाल है, तो इसके लिए इंटरफ़ेस बिल्डर अभी भी एआरसी के साथ किया जा रहा है इसे अपनाने के लिए संभव है?

बेशक, मैं समझता हूं कि एआरसी के बिना उस वर्ग को फिर से लिखना आसान हो सकता है, इसलिए सवाल अकादमिक है। :)

+0

इंटरफ़ेस बिल्डर तस्वीर में कैसे आते हैं? यह कैसे संबंधित है? आपके वर्तमान कोड में क्या गलत है? –

+0

इसका उपयोग आईबी में नियंत्रण बांधने के लिए किया जाता है। – Ievgen

उत्तर

10

जब निब संग्रह से निकाला गया है, यह प्रयास करेंगे करने के लिए या तो alloc/init या alloc/initWithCoder: वर्ग का एक नया उदाहरण।

तो, क्या तुम कर सकते हो कि कॉल और फिर से मार्ग यह आपके सिंगलटन वापस जाने के लिए अवरोधन है:

+ (id)sharedInstance { 
    static Singleton *sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
    sharedInstance = [[self actualAlloc] actualInit]; 
    }); 
    return sharedInstance; 
} 

+ (id)actualAlloc { 
    return [super alloc]; 
} 

+ (id)alloc { 
    return [Singleton sharedInstance]; 
} 

- (id)actualInit { 
    self = [super init]; 
    if (self) { 
    // singleton setup... 
    } 
    return self; 
} 

- (id)init { 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)decoder { 
    return self; 
} 

यह अनुमति देता है -init और -initWithCoder: सुरक्षित रूप से एक ही वस्तु पर कई बार कहा जाता है। आम तौर पर इसकी अनुमति देने की अनुशंसा नहीं की जाती है, लेकिन यह देखते हुए कि सिंगलेट्स पहले से ही "ऐसी जगह" के मामले हैं जहां चीजें वास्तव में जीत सकती हैं ", यह सबसे बुरा नहीं है जो आप कर सकते हैं।

+1

यह सही है। लेकिन मैं एआरसी के बारे में बात कर रहा था। जो उस चाल को अनुमति नहीं देता है [[[सिंगलटन साझा किया गया] बनाए रखें] ' – Ievgen

+0

@ यूजीन तो फिर 'बनाए रखने' के लिए कॉल करें। –

+0

मैं अभी भी पालन नहीं करता हूं। अगर मैं 'रखरखाव' लेता हूं - मेरे सिंगलटन को तब जारी किया जाएगा जब आईबी इसके साथ किया जाएगा। एआरसी का उपयोग करते हुए – Ievgen

3

बस पूरा होने के लिए, यहां सिंगलटन का कार्यान्वयन है जिसका उपयोग इंटरफ़ेस बिल्डर से किया जा सकता है। अंतर actualAlloc विधि में है। [super alloc] के रूप में अभी भी [self allocWithZone:] पर कॉल होगा - यह ऑब्जेक्ट आवंटित नहीं करेगा।

Singleton.h

@interface Singleton : NSObject 

+ (instancetype)sharedInstance; 

@end 

Singleton.m

@implementation Singleton 

+ (instancetype)sharedInstance { 
    __strong static id _sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     _sharedInstance = [[self _alloc] _init]; 
    }); 
    return _sharedInstance; 
} 

+ (id)allocWithZone:(NSZone *)zone { 
    return [self sharedInstance]; 
} 

+ (id)alloc { 
    return [self sharedInstance]; 
} 

- (id)init { 
    return self; 
} 

+ (id)_alloc { 
    return [super allocWithZone:NULL]; //this is important, because otherwise the object wouldn't be allocated 
} 

- (id)_init { 
    return [super init]; 
} 

@end 
+0

हर किसी के लिए (ज्यादातर मेरा) लाभ ... मैंने [केवल एकमात्र संशोधित गिस्ट बनाया] (https://gist.github.com/mralexgray/6891945) इसके बारे में। क्यूं कर? क्योंकि यह केवल एक चीज है जो काम करती है। –

0

@Eugene, IOS दस्तावेज़ सेट से, "ऐतिहासिक कारणों से allocallocWithZone: invokes।", इसलिए, वहाँ alloc विधि को फिर से लागू करने की आवश्यकता नहीं है।