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

时间:2016-09-15 17:46:37

标签: objective-c

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

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

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

1 个答案:

答案 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)
);