每一个线程都可以持有一个该线程固有的NSMutableDictionary类型的字典
官方解释:对对象aTarget调用方法创建新线程并执行
aSelector必须是仅获取一个id类型参数且返回值为void的执行方法
我觉得应该就是让aTarget对象执行aSelector消息 但是并不是用主线程来执行 而是新创建一个新线程来执行 执行结束后线程随之终止 线程从最初就和父线程分离 会自动创建自动释放池
选择器aSelector和参数arg中指定的方法的执行依赖于主线程。wait为YES时 当前线程会一直等待值执行接受 主线程中必须有runloop
NSLock*countLock = [[NSLock alloc]init];
[countLock lock];
//[countLock lock];//注意 如果重复加锁就会造成死锁 当前进程也会进入休眠
[countLock unlock];
[countLock tryLock];//尝试获得锁 如果可以则返回YES 如果不能并不会进入休眠 而是直接返回NO 并且继续执行下面的代码
就是这个锁在初始化的时候会设置一个condition值 这个就相当于密码 只有你在调用这个锁的时候带着相同的condition才能使用锁
如果锁在使用:则线程进入休眠
如果锁不在使用 :
1.如果这个condition值和锁的condition值一样 则可以使用这个锁 就是正常的使用锁
2.如果condition不一致 则进入休眠
这个没懂 是只有值相同的才能解锁吗 还是什么意思
一样 就是加个条件 值要一样
//主要是避免这个情况
NSLock*countLock = [[NSLock alloc]init];
[countLock lock];
[countLock lock];//注意 如果重复加锁就会造成死锁 当前进程也会进入休眠
//这样就不会
NSRecursiveLock*countLock = [[NSRecursiveLock alloc]init];
[countLock lock];
[countLock lock];//同样 此时其他进程是没办法获得这个锁的 会进入休眠 唯一缺点可能就是性能没那么好
@synchronized(obj)
{
//记述想要排斥的内容
}
运行时会自动创建执行该段代码块的锁(mutex)
obj通常指定为该互斥锁要保护的对象 obj自己不需要是锁的对象
同一个obj的@synchronized块如果有多个 则不可以同时执行