解决 —— 互斥锁:
// 1、创建锁
NSLock *lock = [[NSLock alloc]init];
// 2、加锁
[lock lock];
//在这里添加要保护的代码
// 3、解锁
[lock unlock];
加锁方式2(不推荐)
@synchronized(锁对象 ) {//锁对象,任何对象都可以
// 在这里添加要保护的代码
}
@synchronized(锁对象) { // 需要锁定的代码 }
注意:锁定1份代码只用1把锁,用多把锁是无效的
OC在定义属性时有nonatomic和atomic两种选择
atomic:原子属性,为setter方法加锁(默认就是atomic)
nonatomic:非原子属性,不会为setter方法加锁
atomic加锁原理
@property (assign, atomic) int age;
- (void)setAge:(int)age
{
@synchronized(self) {
_age = age;
}
}
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;