Цель-C: Результат приведения идентификатора в BOOL? - PullRequest
13 голосов
/ 19 августа 2011

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

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

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

Ответы [ 4 ]

29 голосов
/ 19 августа 2011

Указатель больше, чем 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)
7 голосов
/ 19 августа 2011

Какова реальная цель вашего метода?

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

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

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

5 голосов
/ 19 октября 2011

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

return !!object;
4 голосов
/ 19 августа 2011

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

return object != nil;

будет.

...