通常我们会将一个对象传递给@synchronized()块以进行唯一引用。例如,
+(id)sharedDBHandler
{
@synchronized (self) {
if (sDBHandler == nil) {
sDBHandler = [self new];
}
}
return sDBHandler;
}
如果我们将nil传递给它会发生什么?
答案 0 :(得分:7)
根本没有@synchronize()。没有锁。无操作。未定义的行为。
完全有效的问题,顺便说一下,无论代码是否过时,不再是生成单例的正确方法。
来自github存储库。虽然没有记录在案的声明,但违反此政策会导致兼容地狱。
int objc_sync_enter(id obj)
{
int result = OBJC_SYNC_SUCCESS;
if (obj) {
SyncData* data = id2data(obj, ACQUIRE);
assert(data);
data->mutex.lock();
} else {
// @synchronized(nil) does nothing
if (DebugNilSync) {
_objc_inform("NIL SYNC DEBUG: @synchronized(nil); set a breakpoint on objc_sync_nil to debug");
}
objc_sync_nil();
}
return result;
}
其中:
BREAKPOINT_FUNCTION(
void objc_sync_nil(void)
);