ios - Objective C তে GCD এর dispatch_once ব্যবহার করে সিঙ্গলটন তৈরি করুন




objective-c singleton (6)

instancetype

instancetype Objective-C তে অনেক ভাষা এক্সটেনশনগুলির মধ্যে একটি মাত্র, প্রতিটি নতুন রিলিজের সাথে আরও যোগ করা হচ্ছে।

এটা জানি, এটা ভালোবাসি।

এবং নিম্ন-স্তরের বিশদগুলিতে মনোযোগ দেওয়ার পদ্ধতিটি কীভাবে আপনি উদ্দেশ্য-সি রূপান্তরিত করার জন্য শক্তিশালী নতুন উপায়ে অন্তর্দৃষ্টি দিতে পারেন তার একটি উদাহরণ হিসাবে গ্রহণ করুন।

এখানে পড়ুন: instancetype

+ (instancetype)sharedInstance
{
    static dispatch_once_t once;
    static id sharedInstance;

    dispatch_once(&once, ^
    {
        sharedInstance = [self new];
    });    
    return sharedInstance;
}
+ (Class*)sharedInstance
{
    static dispatch_once_t once;
    static Class *sharedInstance;

    dispatch_once(&once, ^
    {
        sharedInstance = [self new];
    });    
    return sharedInstance;
}

আপনি iOS 4.0 বা উপরে লক্ষ্য করতে পারেন

জিডিডি ব্যবহার করে, উদ্দেশ্য সি (সিঙ্গেল নিরাপদ) এ সিঙ্গল্ট তৈরি করার সেরা উপায়?

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

MySingleton.h

@interface MySingleton : NSObject

+(instancetype)sharedInstance;

+(instancetype)alloc __attribute__((unavailable("alloc not available, call sharedInstance instead")));
-(instancetype)init __attribute__((unavailable("init not available, call sharedInstance instead")));
+(instancetype)new __attribute__((unavailable("new not available, call sharedInstance instead")));
-(instancetype)copy __attribute__((unavailable("copy not available, call sharedInstance instead")));

@end

MySingleton.m

@implementation MySingleton

+(instancetype)sharedInstance {
    static dispatch_once_t pred;
    static id shared = nil;
    dispatch_once(&pred, ^{
        shared = [[super alloc] initUniqueInstance];
    });
    return shared;
}

-(instancetype)initUniqueInstance {
    return [super init];
}

@end

আপনি বরাদ্দ পদ্ধতি overwriting সঙ্গে বরাদ্দ বরাদ্দ যে এড়াতে পারেন।

@implementation MyClass

static BOOL useinside = NO;
static id _sharedObject = nil;


+(id) alloc {
    if (!useinside) {
        @throw [NSException exceptionWithName:@"Singleton Vialotaion" reason:@"You are violating the singleton class usage. Please call +sharedInstance method" userInfo:nil];
    }
    else {
        return [super alloc];
    }
}

+(id)sharedInstance
{
    static dispatch_once_t p = 0;
    dispatch_once(&p, ^{
        useinside = YES;
        _sharedObject = [[MyClass alloc] init];
        useinside = NO;
    });   
    // returns the same object each time
    return _sharedObject;
}

আপনি যদি [[MyClass alloc] init] শেয়ার করা ইনস্ট্যান্সের মত একই জিনিসটি ফেরত দিতে চান (আমার মতে প্রয়োজনীয় নয়, তবে কিছু লোকেরা এটি চান), এটি একটি দ্বিতীয় dispatch_once ব্যবহার করে খুব সহজেই এবং নিরাপদে করা যেতে পারে:

- (instancetype)init
{
    static dispatch_once_t once;
    static Class *sharedInstance;

    dispatch_once(&once, ^
    {
        // Your normal init code goes here. 
        sharedInstance = self;
    });

    return sharedInstance;
}

এটি [[MyClass alloc] init] এবং [MyClass sharedInstance] এর যেকোনো সংমিশ্রণকে একই বস্তু ফিরিয়ে আনতে দেয়। [MyClass শেয়ারইনস্ট্যান্স] শুধু একটু বেশি কার্যকর হবে। এটি কিভাবে কাজ করে: [MyClass SharedInstance] একবার [[MyClass alloc] init] কে কল করবে। অন্যান্য কোড এটি কল করতে পারে, অনেক বার। Init এর প্রথম কলকাতাটি "স্বাভাবিক" প্রারম্ভিকীকরণ করবে এবং init পদ্ধতিতে একক্টোন বস্তুটিকে সরিয়ে দেবে। যেকোনো পরবর্তী কল ইনটটি সম্পূর্ণভাবে উপেক্ষা করবে এবং একই ভাগ করা ইনস্ট্যান্স ফেরত দেবে; বরাদ্দ ফলাফল বরখাস্ত করা হবে।

+ শেয়ার করা Instance পদ্ধতি সবসময় কাজ হিসাবে কাজ করবে। যদি [[MyClass alloc] init] কল করার প্রথম কলকারী না হয়, তাহলে init ফলাফলটি alloc কলটির ফলাফল নয়, তবে এটি ঠিক আছে।


ডেভ সঠিক, যে পুরোপুরি সূক্ষ্ম। আপনি যদি ShareFoo পদ্ধতিটি ব্যবহার না করে তবে ক্লাসগুলি কেবলমাত্র তৈরি করা যেতে পারে তা নিশ্চিত করতে অন্য কয়েকটি পদ্ধতি বাস্তবায়নের জন্য টিপসগুলির জন্য একটি সিঙ্গলটন তৈরি করতে অ্যাপল এর ডক্সগুলি পরীক্ষা করতে চাইতে পারেন।


থ্রেড নিরাপদ এককন্টন তৈরি করতে আপনি এটি করতে পারেন:

@interface SomeManager : NSObject
+ (id)sharedManager;
@end

/* thread safe */
@implementation SomeManager

static id sharedManager = nil;

+ (void)initialize {
    if (self == [SomeManager class]) {
        sharedManager = [[self alloc] init];
    }
}

+ (id)sharedManager {
    return sharedManager;
}
@end

এবং এই ব্লগ একজোন / কোকো মধ্যে একক খুব ভাল singletons ব্যাখ্যা





grand-central-dispatch