在Objective C中,如果我们将nil或null传递给@synchronized()块会发生什么?



通常我们会传递一个对象给@synchronized()块作为唯一引用。例如,

+(id)sharedDBHandler
{
    @synchronized (self) {
        if (sDBHandler == nil) {
            sDBHandler = [self new];
        }
    }
    return sDBHandler;
}

如果给它传递nil会发生什么?

它根本没有@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)
);

最新更新