সম্পাদনা: এই বাস্তবায়নটি এআরসি দিয়ে অচল। দয়া করে এক নজরে দেখুন কীভাবে আমি একটি ওজেক্টিভ সি সিঙ্গলটন প্রয়োগ করব যা এটিআরসি সাথে সামঞ্জস্যপূর্ণ? সঠিক বাস্তবায়নের জন্য।
আমি অন্যান্য উত্তরে পড়েছি আরম্ভের সমস্ত বাস্তবায়ন একটি সাধারণ ত্রুটি ভাগ করে।
+ (void) initialize {
_instance = [[MySingletonClass alloc] init] // <----- Wrong!
}
+ (void) initialize {
if (self == [MySingletonClass class]){ // <----- Correct!
_instance = [[MySingletonClass alloc] init]
}
}
অ্যাপল ডকুমেন্টেশন আপনাকে আপনার প্রারম্ভিক ব্লকটিতে শ্রেণীর ধরণের পরীক্ষা করার পরামর্শ দেয়। কারণ সাবক্লাসগুলি ডিফল্টরূপে আরম্ভকে কল করে। অপ্রকাশ্য একটি কেস রয়েছে যেখানে কেভিওর মাধ্যমে পরোক্ষভাবে সাবক্ল্যাস তৈরি করা যেতে পারে। আপনি যদি অন্য ক্লাসে নিম্নলিখিত লাইনটি যুক্ত করেন তবে:
[[MySingletonClass getInstance] addObserver:self forKeyPath:@"foo" options:0 context:nil]
অবজেক্টিভ-সি সুস্পষ্টভাবে মাইসিংলেটনক্লাসের একটি সাবক্লাস তৈরি করবে যার ফলস্বরূপ দ্বিতীয়টি ট্রিগার হবে +initialize
।
আপনি ভাবতে পারেন যে আপনার ইন ব্লকে সদৃশভাবে সদৃশভাবে পরীক্ষা করা উচিত:
- (id) init { <----- Wrong!
if (_instance != nil) {
// Some hack
}
else {
// Do stuff
}
return self;
}
তবে আপনি নিজেকে পায়ে গুলি করবেন; বা আরও খারাপ অন্য কোনও বিকাশকারীকে তাদের পায়ে গুলি করার সুযোগ দিন।
- (id) init { <----- Correct!
NSAssert(_instance == nil, @"Duplication initialization of singleton");
self = [super init];
if (self){
// Do stuff
}
return self;
}
টিএল; ডিআর, আমার বাস্তবায়ন এখানে
@implementation MySingletonClass
static MySingletonClass * _instance;
+ (void) initialize {
if (self == [MySingletonClass class]){
_instance = [[MySingletonClass alloc] init];
}
}
- (id) init {
ZAssert (_instance == nil, @"Duplication initialization of singleton");
self = [super init];
if (self) {
// Initialization
}
return self;
}
+ (id) getInstance {
return _instance;
}
@end
(আমাদের নিজস্ব জোর ম্যাক্রোর সাথে জেডএসার্ট প্রতিস্থাপন করুন; বা কেবল এনএসএসর্ট করুন sert)