java中有方法修饰符,例如public synchronized func()
,这样可以保证这个方法在某个时间点只会被一个对象调用,OC有没有这样的方法啊,假如排除NSlock这种方法的话。
方法级别的控制没有语言级别的修饰符,可以将代码块加锁。
加锁的方法很多。
@synchronized
NSLock
pthread_mutex
dispatch_semaphore
OSSpinLock
1. @synchronized
@interface A : NSObject {
NSObject _lock;
}
- (void)func {
@synchronized(_lock) {
// do something
}
}
2. NSLock
- (void) func {
[_lock lock];
// do something
[_lock unlock];
}
3. pthread_mutex
@interface A : NSObject {
pthread_mutex_t lock;
}
- (instance)init {
// 省略
pthread_mutex_init(&_lock, NULL);
}
- (void)func {
pthread_mutex_lock(&lock);
// do something
pthread_mutex_unlock(&lock);
}
4. dispatch_semaphore
@interface A : NSObject {
dispatch_semaphore_t _semaphore;
}
- (instance)init {
// 省略
_semaphore = dispatch_semaphore_create(1);
}
- (void)func {
dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER);
// do something
dispatch_semaphore_signal(_semaphore);
}
5.OSSpinLock
由于自旋锁在iOS中不再安全,这边也不介绍了,具体可以看这篇博客
不再安全的 OSSpinLock
用GCD+block。