Использование dispatch_once_t для объекта, а не для класса

Существует несколько источников, вызывающих определенный метод, но я хотел бы убедиться, что он вызывается ровно один раз (для каждого объекта)

Я хотел бы использовать синтаксис, как

// method called possibly from multiple places (threads)
-(void)finish
{

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [self _finishOnce]; // should happen once per object
    });
}
// should only happen once per object
-(void)_finishOnce{...}

Проблема в том, что токен распределяется между всеми экземплярами одного и того же класса - так что это не хорошее решение - существует ли dispatch_once_t для объекта - если нет, то каков наилучший способ гарантировать, что он вызывается один раз?

РЕДАКТИРОВАТЬ:

Вот предлагаемое решение, о котором я думаю - кажется ли это хорошо?

@interface MyClass;

@property (nonatomic,strong) dispatch_queue_t dispatchOnceSerialQueue; // a serial queue for ordering of query to a ivar

@property (nonatomic) BOOL didRunExactlyOnceToken;

@end

@implementation MyClass

-(void)runExactlyOnceMethod
{
  __block BOOL didAlreadyRun = NO;
  dispatch_sync(self.dispatchOnceSerialQueue, ^{
     didAlreadyRun = _didRunExactlyOnceToken;
     if (_didRunExactlyOnceToken == NO) {
        _didRunExactlyOnceToken = YES;
     }
  });
  if (didAlreadyRun == YES)
  {
    return;
  }
  // do some work once
}

Ответы на вопрос(3)

Ваш ответ на вопрос