2021년 2월 24일 수요일

[iOS] @synchronized 배타 제어 (객체 동시접근 방지)

참고: https://dolfalf.tistory.com/145

https://aroundck.tistory.com/4705


가장간단한건 

 // self를 키로 락을 검. 어디선가 self로 락을 건경우 락이 해제될 때까지 여기서 기다리게됨.
@synchronized (self) {
  [_mutableItems addObject:object];
}


보통 이런식으로도 씀.

@implementation MyClass

{

// 잠금시 키로 지정하는 인스턴스를 저장할 위치를 제공합니다.

NSObject * _objectForLock;

}


이것을 init 메소드 등의 어딘가 적절한 위치로 초기화합니다.

- (id) init

{

self = [super init];


if (self)

{

// 잠금시 키로 지정하는 인스턴스를 준비합니다.

_objectForLock = [[NSObject alloc] init];

}

return self;


}


ARC 환경이라면 Objective-C 인스턴스는 필요하지 않을 때 출시되므로 뒤처리가 필요하지 않습니다.


ARC 환경이 아닌 경우는 -dealloc 메소드 등으로 잠금을 확보 한 인스턴스를 release하도록합니다.


@synchronized의 인수로 사용합니다.


@synchronized (_objectForLock)

{


}


Effective Object-C 에서는 

_syncQueue = dispatch_queue_create("com.effectiveobjectivec.syncQueue", NULL); 

이렇게도 쓰라고함

0 comments:

댓글 쓰기