मुझे नेट पर सिंगलटन पैटर्न मिला है। ऐसा लगता है कि इसमें कई चीजें हैं जिन्हें अनुकूलित किया जा सकता है।उद्देश्य-सी - इस सिंगलटन पैटर्न को अनुकूलित करना?
-sharedMySingleton
विधि, बनाए रखने की आवश्यकता नहीं है? मुझे यकीन नहीं है ...
-अगर नहीं, allocWithZone
में कोई रखरखाव क्यों है?
- @synchronized
का उपयोग क्या है। NSAssert लगता है कि ब्लॉक में कई बार कहा जा सकता है, ताकि यदि हाँ, वहाँ पिछले स्मृति जारी है, या बस NSAsserting बिना स्पष्ट रूप से ब्लॉक बाहर निकलने के लिए कुछ और कोड होना चाहिए, और अगर नहीं, क्यों इस NSAssert है?
- श्रृंखला sharedMySingleton
और alloc
के बीच श्रृंखला अजीब लगती है। मैं अपने आप को कुछ तरह लिखा था:
+(MySingleton*)sharedMySingleton
{
@synchronized([MySingleton class])
{
if (_sharedMySingleton == nil) _sharedMySingleton = [[self alloc] init];
return _sharedMySingleton;
}
return nil;
}
+(id)alloc
{
@synchronized([MySingleton class])
{
return [super alloc];
}
return nil;
}
सिंगलटन पैटर्न
#import "MySingleton.h"
@implementation MySingleton
// ##########################################################################################################
// ######################################## SINGLETON PART ##################################################
// ##########################################################################################################
static MySingleton* _sharedMySingleton = nil;
// =================================================================================================
+(MySingleton*)sharedMySingleton
// =================================================================================================
{
@synchronized([MySingleton class])
{
if (_sharedMySingleton == nil) [[self alloc] init];
return _sharedMySingleton;
}
return nil;
}
// =================================================================================================
+(id)alloc
// =================================================================================================
{
@synchronized([MySingleton class])
{
NSAssert(_sharedMySingleton == nil, @"Attempted to allocate a second instance of a singleton.");
_sharedMySingleton = [super alloc];
return _sharedMySingleton;
}
return nil;
}
+ (id)allocWithZone:(NSZone *)zone { return [[self sharedMySingleton] retain]; }
- (id)copyWithZone:(NSZone *)zone { return self; }
- (id)retain { return self; }
- (NSUInteger)retainCount { return NSUIntegerMax; /* denotes an object that cannot be released */}
- (oneway void)release { /* do nothing */ }
- (id)autorelease { return self; }
// ##########################################################################################################
// ##########################################################################################################
// ##########################################################################################################
// =================================================================================================
-(id)init
// =================================================================================================
{
if (!(self = [super init])) return nil;
return self;
}
// =================================================================================================
-(void) dealloc
// =================================================================================================
{
[super dealloc];
}
// =================================================================================================
-(void)test
// =================================================================================================
{
NSLog(@"Hello World!");
}
@end
क्या अन्य तरीकों के बारे में: आपके पास होंगे, retaincount, रिहाई, copyWithZone, ...? आप "आधुनिक" संस्करणों के बारे में क्यों बात कर रहे हैं? आधुनिक से आपका क्या मतलब है? इस तरह के कोड के साथ ऐप्पल ने अपने सिंगलटन स्निपेट को अपडेट क्यों नहीं किया? – Oliver
आधुनिक रूप से, मेरा मतलब है जीसीडी की शुरूआत के बाद से। आपको इन तरीकों को ओवरराइड नहीं करना चाहिए। केवल नमूना कोड है कि इन अधिभावी से पता चलता है यहाँ: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html यह नोट के रूप में, यह एक * सख्त * कार्यान्वयन है सिंगलटन का, जो ऊपर वर्णित पाठ आम तौर पर आवश्यक नहीं है। मैंने इस दस्तावेज़ को बेहतर बनाने के लिए एक डॉक्टर केस खोला है क्योंकि यह बहुत से डेवलपर्स को भ्रमित कर रहा है। माइक ऐश इस पर एक अच्छी पोस्ट है: http://www.mikeash.com/pyblog/friday-qa-2009-10-02-care-and-feeding-of-singletons.html –
क्या में 10.6 के बराबर है आईओएस की शर्तें? – Oliver