iOS. Экземпляр NSObject mallo c память на 16 байт? На чем основа? - PullRequest
0 голосов
/ 17 июня 2020
+ (id)alloc {
    return _objc_rootAlloc(self);
}
=>
id
_objc_rootAlloc(Class cls)
{
    return callAlloc(cls, false/*checkNil*/, true/*allocWithZone*/);
}
=>
static ALWAYS_INLINE id
callAlloc(Class cls, bool checkNil, bool allocWithZone=false)
{
#if __OBJC2__
    if (slowpath(checkNil && !cls)) return nil;
    if (fastpath(!cls->ISA()->hasCustomAWZ())) {
        return _objc_rootAllocWithZone(cls, nil);
    }
#endif
    // No shortcuts available.
    if (allocWithZone) {
        return ((id(*)(id, SEL, struct _NSZone *))objc_msgSend)(cls, @selector(allocWithZone:), nil);
    }
    return ((id(*)(id, SEL))objc_msgSend)(cls, @selector(alloc));
}

=>
// Replaced by ObjectAlloc
+ (id)allocWithZone:(struct _NSZone *)zone {
    return _objc_rootAllocWithZone(self, (malloc_zone_t *)zone);
}
=>
id
_objc_rootAllocWithZone(Class cls, malloc_zone_t *zone)
{
    id obj;

    if (fastpath(!zone)) {
        obj = class_createInstance(cls, 0);
    } else {
        obj = class_createInstanceFromZone(cls, 0, zone);
    }

    if (slowpath(!obj)) obj = _objc_callBadAllocHandler(cls);
    return obj;
}
=>
id class_createInstanceFromZone(Class cls, size_t extraBytes, void *z)
{
    OBJC_WARN_DEPRECATED;
    return (*_zoneAlloc)(cls, extraBytes, z);
}
=>
id (*_zoneAlloc)(Class, size_t, void *) = _class_createInstanceFromZone;
=>
id 
_class_createInstanceFromZone(Class cls, size_t extraBytes, void *zone)
{
    void *bytes;
    size_t size;

    // Can't create something for nothing
    if (!cls) return nil;

    // Allocate and initialize
    size = cls->alignedInstanceSize() + extraBytes;

    // CF requires all objects be at least 16 bytes.

    if (size < 16) size = 16;

    if (zone) {
        bytes = malloc_zone_calloc((malloc_zone_t *)zone, 1, size);
    } else {
        bytes = calloc(1, size);
    }

    return objc_constructInstance(cls, bytes);
}

Я получил указанную выше функцию из файла obj c -class-old.mm объекта objc4; // CF requires all objects be at least 16 bytes. Отсюда я могу получить как минимум 16 байтов malloc;

Но,

=>
id class_createInstanceFromZone(Class cls, size_t extraBytes, void *z)
{
    OBJC_WARN_DEPRECATED;
    return (*_zoneAlloc)(cls, extraBytes, z);
}

Оператор OBJC_WARN_DEPRECATED устарел; следовательно, могу ли я понять проблему 16 байтов в таком порядке; Если я могу следовать этому приказу, как мне понять этот OBJC_WARN_DEPRECATED?

Я надеюсь, что вы поможете мне разрешить мои сомнения; спасибо

1 Ответ

0 голосов
/ 17 июня 2020

Эта устаревшая функция вызывается, только если zone! = NULL. Обычно вместо этого вызывается class_createInstance. Зоны устарели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...