Подтвердить что ты не робот

Objective-C: Результат литья идентификатора BOOL?

Возвращает ли следующая функция YES, если object != nil?

- (BOOL)boolForObject:(id)object {
    return (BOOL)object;
}

Я тестировал с помощью object = [[NSObject alloc] init], но получал смешанные результаты.

4b9b3361

Ответ 1

Указатель больше, чем BOOL, поэтому, когда вы бросаете его, он будет усекать и принимать только 8 наименее значимых бит указателя и сделать его BOOL. Если эти биты все равны нулю, это эквивалентно NO.

Итак, чтобы ответить на ваш вопрос, нет, это не так (ну иногда это будет в зависимости от значения указателя)

Вот пример использования Xcode 5.1.1 на 32-битной архитектуре:

void* p = (void*)0xfeeeff00;
BOOL  b = (BOOL)p;

NSLog(@"p=%08x (%lu), b=%08x (%lu)", (uint32_t)p, sizeof p, (uint32_t)b, sizeof b);

Он печатает:

p=feeeff00 (4), b=00000000 (1)

Ответ 2

Какова фактическая цель вашего метода?

Если просто проверить, нет ли ни одного объекта, почему бы не сделать это так:

- (BOOL)boolForObject:(id)object 
{
    return (object != nil);
}

Более очевидно, какой результат будет.

Ответ 3

Вы также можете сделать:

return !!object;

Ответ 4

Я так не думаю, но

return object != nil;

будет.